Android Architecture Components时代在哪里放置Toasts,Snackbars等

时间:2018-11-27 20:31:53

标签: android android-architecture-components android-viewmodel

ViewModelone activity multiple fragments概念时代,将吐司,小吃店放入活动与片段的建议是什么。

很明显,类似

  • 新意向
  • 片段交易/片段设置
  • 许可请求
  • 展示导航组件(抽屉,viewpager)

应该由活动来处理,但是吐司 / 小吃店呢?

关于如何在Fragment中显示Toasts或Snackbars以及如何以及何时使用getContext()的问题如此之多,我倾向于让活动处理所有显示的消息。

使用ViewModel和SingleLiveEvent可以很容易地拥有一个由活动和片段观察的sharedViewModel,并且在需要时,片段会调度一个事件来通知活动以显示消息。

那么您在考虑可重复性和关注点分离的同时,您认为最佳做法/建议是什么?

4 个答案:

答案 0 :(得分:0)

这取决于。也许您总是可以用一些UI部件(TextView,Button)或Dialogs / DialogFragments替换Toast / snackbars。

它确实取决于您的应用程序体系结构,但是我想您可以设计一些依赖项:活动范围或片段范围,因此您可以将其作为ViewModel的抽象注入,并按需要使用。

恕我直言,如果您要处理Toasts,则可以在活动/应用程序范围内设计MessageShower并在任何地方重复使用(处理Toast的单个实例),但是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(); 
    }

}

答案 1 :(得分:0)

您可以创建BaseActivityBaseFragment,在其中创建所有常见的方法,例如Toast,Snackbar等,这些方法在YourActivityYourFragment中进行了扩展。

答案 2 :(得分:0)

Google's codelabs on basic architecture components为线索,让片段/活动对ViewModel中的变化做出反应似乎更好。

从上面的Google链接中,这意味着最有效的方法之一是从您的​​Observe()LiveData对象的ViewModel属性Activity

答案 3 :(得分:0)

使用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属性的按钮的ID 请记住,.signIn之前的登录名是指您的变量名

在您的viewModel中

fun signIn(view: View){
   //use view to display your snack bar
}