在ViewModel
和one activity multiple fragments
概念时代,将Toast、Snackbar放在"活动"与"碎片"中有什么建议。
很明显,像这样的东西
- 新意愿
- 碎片事务/碎片设置
- 权限请求
- 显示导航组件(抽屉、寻呼机(
应该由活动处理,但烤面包/小吃呢?
关于如何在Fragment中显示Toast或Snackbar,以及如何+何时使用getContext()
,有很多问题,我倾向于让活动处理所有显示的消息。
使用ViewModel和SingleLiveEvent,可以很容易地创建一个由活动和片段观察的共享ViewModel,并且在需要时,片段会调度一个事件,通知活动显示消息。
那么,在考虑到责任和关注点分离的同时,你认为什么是最佳实践/建议?
借鉴谷歌关于基本架构组件的代码实验室,让片段/活动对ViewModel
中的更改做出反应似乎更好。
从上面的谷歌链接来看,这意味着最有效的方法之一是从Activity
中Observe()
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();
}
}
您可以创建BaseActivity
和BaseFragment
,在其中创建所有常见方法,如Toast、Snackbar等,这些方法在YourActivity
和YourFragment
中进行了扩展。
使用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
}