具有单个活动,多个片段的DataBinding和ViewModel的生命周期所有者

时间:2020-01-01 21:54:35

标签: android mvvm android-lifecycle android-databinding android-viewmodel

我正在实现我的应用程序的登录和注册部分,并将MVVM与数据绑定一起使用。我有两个屏幕,分别对应登录和注册功能。与其他应用类似,用户将首先看到登录页面。用户可以从那里导航到注册页面。从注册页面,用户可以导航回登录等。

主动性/碎片使用

我正在使用单个服务(firebase)作为MVVM的数据源部分。我将整个授权过程设计为单个中心活动,并带有一个容器来替换(嵌入)片段。有两个片段分别对应登录页面和注册页面。我的整个视图(输入字段,按钮等)都嵌入片段中。还有两个ViewModel(LoginViewModel,SignUpViewModel)。我通过观察LoginViewModel中的一个Event变量和SignupViewModel中的另一个SingleLiveEvent变量,将我的活动仅用于导航事件(用于登录的页面登录/用于登录的登录)。这意味着我需要从我的活动中获取2个事件变量(因此需要2个ViewModels)以观察这些事件并管理导航。

我正在提供我的代码。在这种情况下,对于观察者,数据绑定和视图模型,处理“生命周期所有者问题”的正确方法是什么?我想到了“在活动中观察事件是否正确”,“谁应该是生命周期所有者?应该是视图,片段还是活动等。我也愿意为更好的实践而更改设计。

关于观察事件,视图模型,生命周期和片段替换的我的活动代码

    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();
    }

0 个答案:

没有答案
相关问题