【问题标题】:NavHostFragment getActivity.getSupportFragmentManager is always nullNavHostFragment getActivity.getSupportFragmentManager 始终为空
【发布时间】:2022-10-13 14:57:26
【问题描述】:

我的 activity_main 中有一个 FragmentContainerView

<androidx.fragment.app.FragmentContainerView
        android:id="@+id/main_fragment"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="1dp"
        app:navGraph="@navigation/nav_graph"
        app:defaultNavHost="true"/>

在我的 fragment_login 中,我尝试通过单击 fab 转到另一个片段

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
        <variable
            name="localVariable"
            type="personal.net.handheldrfidreader.viewmodels.LoginViewModel"
            />
    </data>

    <androidx.coordinatorlayout.widget.CoordinatorLayout>
    
        ...
    
        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:baselineAlignBottom="false"
            android:clickable="true"
            android:src="@drawable/ic_settings"
            app:fabSize="normal"
            app:layout_anchor="@id/appbar"
            app:layout_anchorGravity="end|bottom"
            android:layout_marginRight="30dp"
            android:backgroundTint="@color/light_orange"
            android:tint="@color/white"
            />
    </androidx.coordinatorlayout.widget.CoordinatorLayout>
</layout>

我这样调用 LoginFragment 中的导航控制器:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(getActivity(), R.layout.fragment_login);
        viewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
        binding.setLifecycleOwner(this);
        binding.setLocalVariable(viewModel);
    }


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

        setupButtons();
    }

private void setupButtons() {

        binding.fab.setOnClickListener(v -> {
            NavHostFragment navHostFragment = (NavHostFragment) getActivity().getSupportFragmentManager()
                    .findFragmentById(R.id.nav_graph);
            NavController navController = navHostFragment.getNavController();
            navController.navigate(R.id.action_loginFragment_to_settingsFragment);
        });
    }

但是在

NavHostFragment navHostFragment = (NavHostFragment) getActivity().getSupportFragmentManager()
                        .findFragmentById(R.id.nav_graph);

我得到一个空值。

【问题讨论】:

    标签: java android


    【解决方案1】:

    您的 FragmentContainerView 具有 id @+id/main_fragment 并且在您的 LoginFragment 中您正在搜索具有 id R.id.nav_graph 的片段。这就是为什么你得到一个空值。

    首先将您的 id 更改为 nav_graph:

    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_graph"
        android:name="androidx.navigation.fragment.NavHostFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="1dp"
        app:navGraph="@navigation/nav_graph"
        app:defaultNavHost="true"/>
    

    然后在 LoginFragment 中获取您的 navController:

    NavController navController = activity?.findNavController(R.id.nav_graph)
    

    现在您应该能够导航到 SettingsFragment。

    【讨论】:

    • 而已。谢谢你指出这一点。就是这样,我没有收到任何错误,但不知何故,我无法导航。
    • 试试这个: val action = LoginFragmentDirections.actionLoginFragmentToSettingsFragment navController.navigate(action)
    【解决方案2】:

    在您的情况下,getActivity() 返回 null。尝试以下操作:

    private AppCompatActivity activity;
    
    @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            binding = DataBindingUtil.setContentView(getActivity(), R.layout.fragment_login);
            viewModel = ViewModelProviders.of(this).get(LoginViewModel.class);
            binding.setLifecycleOwner(this);
            binding.setLocalVariable(viewModel);
        }
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(activity);
    
    if(context instanceof AppCompatActivity){
    activity = ((AppCompatActivity) context)
    }
    }
    
    
    @Override
        public void onViewCreated(@NonNull @NotNull View view, @Nullable @org.jetbrains.annotations.Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);
    
            setupButtons();
        }
    
    private void setupButtons() {
    
            binding.fab.setOnClickListener(v -> {
                NavHostFragment navHostFragment = (NavHostFragment) activity.getSupportFragmentManager()
                        .findFragmentById(R.id.nav_graph);
                NavController navController = navHostFragment.getNavController();
                navController.navigate(R.id.action_loginFragment_to_settingsFragment);
            });
    

    【讨论】:

      猜你喜欢
      • 2017-07-31
      • 2019-07-18
      • 2019-08-18
      • 2011-12-29
      • 2019-07-02
      • 2019-05-04
      • 1970-01-01
      • 2011-05-04
      • 2015-10-29
      相关资源
      最近更新 更多