我正在实现我的应用程序的登录和注册部分,并将MVVM与数据绑定一起使用。我有两个屏幕,分别对应登录和注册功能。与其他应用类似,用户将首先看到登录页面。用户可以从那里导航到注册页面。从注册页面,用户可以导航回登录等。
我正在提供我的代码。在这种情况下,对于观察者,数据绑定和视图模型,处理“生命周期所有者问题”的正确方法是什么?我想到了“在活动中观察事件是否正确”,“谁应该是生命周期所有者?应该是视图,片段还是活动等。我也愿意为更好的实践而更改设计。
关于观察事件,视图模型,生命周期和片段替换的我的活动代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_signin);
navigateToSignInFragment();
signInViewModel = ViewModelProviders.of(this, factory).get(SignInViewModel.class);
signInViewModel.getNavigateToSignUpEvent().observe(this, objectEvent -> {
Object content = objectEvent.getContentIfNotHandled();
if (content != null) {
navigateToSignUpFragment();
}
});
signUpViewModel = ViewModelProviders.of(this, factory).get(SignUpViewModel.class);
signUpViewModel.getNavigateToSignInEvent().observe(this, objectEvent -> {
Object content = objectEvent.getContentIfNotHandled();
if (content != null) {
navigateToSignInFragment();
}
});
}
//navigateToSignUpFragment() method is same
private void navigateToSignInFragment() {
// View Fragment
SignInFragment signInFragment = (SignInFragment) getSupportFragmentManager()
.findFragmentById(R.id.contentFrame);
if (signInFragment == null) {
signInFragment = SignInFragment.newInstance();
}
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.contentFrame, signInFragment);
transaction.commit();
}
关于数据绑定视图模型和生命周期的片段代码:
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_signin, container, false);
if (signinBinding == null) {
signinBinding = FragmentSigninBinding.bind(view);
}
signInViewModel = ViewModelProviders.of(getActivity(), factory).get(SignInViewModel.class);
signinBinding.setViewmodel(signInViewModel);
signinBinding.setLifecycleOwner(getViewLifecycleOwner());
return signinBinding.getRoot();
}