Где разместить тосты, закуски и т. Д. В эпоху компонентов архитектуры Android

Каковы рекомендации по размещению тостов и закусок в Activity vs. Fragment в эпоху концепций ViewModel и one activity multiple fragments.

Понятно, что такие вещи, как

  • новые намерения
  • Фрагментные транзакции / настройка фрагмента
  • запросы на разрешение
  • представление навигационных компонентов (ящик, окно просмотра)

должны обрабатываться по активности, но как насчет тостов / закусок?

Есть так много SO-вопросов о том, как показывать тосты или закуски во фрагменте и как + когда использовать getContext(), что я склонен позволять активности обрабатывать все показываемые сообщения.

С ViewModel и SingleLiveEvent довольно легко иметь sharedViewModel, который будет отслеживаться по активности и фрагментам, и при необходимости фрагмент отправляет событие, которое уведомляет об активности, чтобы показать сообщение.

Итак, что, по вашему мнению, является наилучшей практикой / рекомендуется, имея в виду ответственность и разделение проблем?


person FalloutBoy    schedule 27.11.2018    source источник


Ответы (4)


Взяв реплику из кодовых лабораторий Google по базовым компонентам архитектуры, кажется, лучше позволить фрагментам / действиям реагировать на изменения в ViewModel.

Таким образом, из приведенной выше ссылки Google это означает, что одним из наиболее эффективных методов является Observe() LiveData свойство объекта ViewModel из вашего Activity

person Damilola Olowookere    schedule 13.08.2019

это зависит. Вероятно, вы всегда можете заменить тосты / закуски некоторыми частями пользовательского интерфейса (TextViews, Buttons) или Dialogs / DialogFragments.

это действительно зависит от архитектуры вашего приложения, но я думаю, вы можете создать некоторую зависимость: с активностью или фрагментом, чтобы вы могли внедрить ее как абстракцию для своей ViewModel и использовать как хотите.

IMHO, если вы имеете дело с тостами, вы можете создать MessageShower в области действия / приложения и повторно использовать его повсюду (имея дело с одним экземпляром тоста), но Snackbars нужно отображать View (поэтому им нужен жизненный цикл, и проще сделать память утечка).

interface MessageShower{
    void showMessage(String message);
}

class LongToastMessageShower implements MessageShower{
    private Toast toast;

    public LongToastMessageShower(Context appContext){
         this.toast = Toast.makeText(appContext,"",Toast.LENGTH_LONG);
    }

    @Override
    public void showMessage(String message){
        toast.cancel();
        toast.setText(message);
        toast.show(); 
    }

}
person Lukas    schedule 27.11.2018

Вы можете создать BaseActivity и BaseFragment, где вы создаете все общие методы, такие как Toast, Snackbar и т. Д., Которые расширены в YourActivity и YourFragment.

person Sudip Sadhukhan    schedule 30.11.2018

используйте AndroidViewModel (), например

class LoginViewModel(application: Application) : AndroidViewModel(application) {
     private val context = getApplication<Application>().applicationContext
     //use that context when toasting in your viewModel
}

для закусочной, если это кнопка в вашем xml, используйте этот атрибут и значение

android:onClick="@{() -> login.signIn(signIn)}"

signIn в скобках в этом контексте относится к идентификатору вашей кнопки, для которой вы устанавливаете атрибут onClick. Помните, что вход в систему до .signIn относится к имени вашей переменной

По вашему мнению, модель

fun signIn(view: View){
   //use view to display your snack bar
}
person Moses Altruism    schedule 01.08.2020