使用ViewModel时导航不起作用

哦,瓦伦:

我在android中使用Navigation导航到下一个片段。整个应用程序看起来像这样。

在此处输入图片说明

导航XML

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/nav_graph"
    app:startDestination="@id/landingFragment">

    <fragment
        android:id="@+id/landingFragment"
        android:name="com.varun.matic.fragments.LandingFragment"
        android:label="fragment_landing"
        tools:layout="@layout/fragment_landing">
        <action
            android:id="@+id/action_landingFragment_to_signInFragment"
            app:destination="@id/signInFragment" />
        <action
            android:id="@+id/action_landingFragment_to_signUpFragment"
            app:destination="@id/signUpFragment" />
        <action
            android:id="@+id/action_landingFragment_to_homeFragment"
            app:destination="@id/homeFragment" />
    </fragment>
    <fragment
        android:id="@+id/signInFragment"
        android:name="com.varun.matic.fragments.SignInFragment"
        android:label="fragment_sign_in"
        tools:layout="@layout/fragment_sign_in">
        <action
            android:id="@+id/action_signInFragment_to_homeFragment"
            app:destination="@id/homeFragment" />
    </fragment>
    <fragment
        android:id="@+id/signUpFragment"
        android:name="com.varun.matic.fragments.SignUpFragment"
        android:label="fragment_sign_up"
        tools:layout="@layout/fragment_sign_up">
        <action
            android:id="@+id/action_signUpFragment_to_homeFragment"
            app:destination="@id/homeFragment" />
    </fragment>
    <fragment
        android:id="@+id/homeFragment"
        android:name="com.varun.matic.fragments.HomeFragment"
        android:label="fragment_home"
        tools:layout="@layout/fragment_home" />
</navigation>

问题

我无法回到登陆页面或前进到“ homeFragment ”当我在signInFragment或“ signUpFragment

登录片段

public class SignInFragment extends Fragment {


    private View view;

    public SignInFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_sign_in, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        this.view = view;

        if (getActivity() != null) {
            SignInViewModel viewModel = ViewModelProviders.of(this).get(SignInViewModel.class);
            FragmentSignInBinding binding = DataBindingUtil.setContentView(getActivity(), R.layout.fragment_sign_in);
            binding.setLifecycleOwner(this);
            binding.setViewModel(viewModel);

            observe(viewModel, binding);
        }
    }

    private void observe(SignInViewModel viewModel, FragmentSignInBinding binding) {

        viewModel.getUser().observe(this, user -> {
            if (TextUtils.isEmpty(Objects.requireNonNull(user).name)) {
                binding.userName.setError("Field can't be empty");
                binding.userName.requestFocus();
            } else if (TextUtils.isEmpty(Objects.requireNonNull(user).password)) {
                binding.userPassword.setError("Field can't be empty");
                binding.userPassword.requestFocus();
            } else {
                logIn(viewModel);
            }
        });
    }

    private void logIn(SignInViewModel viewModel) {
        Boolean CredentialsAreOk = viewModel.checkCredentials();
        if (CredentialsAreOk) {
            Navigation.findNavController(this.view).navigate(R.id.action_signInFragment_to_homeFragment);
        }
    }
}

注册片段

public class SignUpFragment extends Fragment {

    private View view;

    public SignUpFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_sign_up, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        this.view = view;

        if (getActivity() != null) {
            final SignUpViewModel viewModel = ViewModelProviders.of(this).get(SignUpViewModel.class);
            final FragmentSignUpBinding binding = DataBindingUtil.setContentView(getActivity(), R.layout.fragment_sign_up);
            binding.setLifecycleOwner(this);
            binding.setViewModel(viewModel);

            observe(viewModel, binding);
        }
    }

    private void observe(SignUpViewModel viewModel, FragmentSignUpBinding binding) {

        viewModel.getUser().observe(this, user -> {
            if (TextUtils.isEmpty(Objects.requireNonNull(user).name)) {
                binding.userName.setError("Field can't be empty");
                binding.userName.requestFocus();
            } else if (TextUtils.isEmpty(Objects.requireNonNull(user).password)) {
                binding.userPassword.setError("Field can't be empty");
                binding.userPassword.requestFocus();
            } else {
                signUp(viewModel, user);
            }
        });
    }

    private void signUp(SignUpViewModel viewModel, User user) {
        Boolean signUpIsSuccessful = viewModel.signUpUser(user.name, user.password);
        if (signUpIsSuccessful) {
            goToHomeFragment();
        }
    }

    private void goToHomeFragment() {
        Navigation.findNavController(view).navigate(R.id.action_signUpFragment_to_homeFragment);
    }
}

我不确定为什么通过此代码直接着陆片段转到homeFragment时为什么会起作用

Navigation.findNavController(view).navigate(R.id.action_landingFragment_to_homeFragment);

后退按钮也应具有预期的功能。

编码先生:

你应该这样做

@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle 
  savedInstanceState) {
  bindings = DataBindingUtil.inflate(inflater, R.layout.layout, container, false)
  bindings.lifecycleOwner = fragment        
  return binding.root
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章