安卓体系结构组件时代的Toast、Snackbar等在哪里



ViewModelone activity multiple fragments概念时代,将Toast、Snackbar放在"活动"与"碎片"中有什么建议。

很明显,像这样的东西

  • 新意愿
  • 碎片事务/碎片设置
  • 权限请求
  • 显示导航组件(抽屉、寻呼机(

应该由活动处理,但烤面包/小吃呢?

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

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

那么,在考虑到责任和关注点分离的同时,你认为什么是最佳实践/建议?

借鉴谷歌关于基本架构组件的代码实验室,让片段/活动对ViewModel中的更改做出反应似乎更好。

从上面的谷歌链接来看,这意味着最有效的方法之一是从ActivityObserve()ViewModel对象的LiveData属性

这取决于情况。也许你总是可以用一些UI部件(文本视图、按钮(或对话框/DialogFragments来替换烤面包/小吃条。

这实际上取决于您的应用程序体系结构,但我想您可以设计一些依赖项:活动或片段范围的,这样您就可以将其作为ViewModel的抽象注入,并按照自己的意愿使用。

IMHO如果你处理toast,你可以在activty/application范围内设计MessageShower,并在任何地方重用它(处理toast的单个实例(,但Snackbar需要显示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(); 
}
}

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

使用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指的是您的变量名

在您的视图中型号

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

相关内容

  • 没有找到相关文章

最新更新