在ViewModel
和one activity multiple fragments
概念时代,将吐司,小吃店放入活动与片段的建议是什么。
很明显,类似
应该由活动来处理,但是吐司 / 小吃店呢?
关于如何在Fragment中显示Toasts或Snackbars以及如何以及何时使用getContext()
的问题如此之多,我倾向于让活动处理所有显示的消息。
使用ViewModel和SingleLiveEvent可以很容易地拥有一个由活动和片段观察的sharedViewModel,并且在需要时,片段会调度一个事件来通知活动以显示消息。
那么您在考虑可重复性和关注点分离的同时,您认为最佳做法/建议是什么?
答案 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)
您可以创建BaseActivity
和BaseFragment
,在其中创建所有常见的方法,例如Toast,Snackbar等,这些方法在YourActivity
和YourFragment
中进行了扩展。
答案 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
}