【问题标题】:Bottom navigation not working底部导航不起作用
【发布时间】:2018-07-15 11:21:04
【问题描述】:

我的底部导航视图不起作用。当我单击项目时我的片段未加载。

beginTransaction() 可能会产生 NullPointerException

这是我的活动:

public static void enableNavigation(Context context, final BottomNavigationViewEx view, final FragmentManager supportFragmentManager){
    view.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
        @Override
        public boolean onNavigationItemSelected(@NonNull MenuItem item) {
            Fragment fragment;
            switch (item.getItemId()){
                case R.id.nav_home:
                    fragment = new FragmentMarker();
                    loadFragment(fragment);
                    return true;
                case R.id.nav_bookmark:
                    fragment = new FragmentBookmark();
                    loadFragment(fragment);
                    return true;
                case R.id.nav_blog:
                    fragment = new FragmentBlog();
                    loadFragment(fragment);
                    return true;
                case R.id.nav_notification:
                    fragment = new FragmentNotification();
                    loadFragment(fragment);
                    return true;
                case R.id.nav_account:
                    fragment = new FragmentAccount();
                    loadFragment(fragment);
                    return true;

            }
           return false;
        }

        private void loadFragment(Fragment fragment) {
            // load fragment
            FragmentTransaction transaction = fragment.getFragmentManager().beginTransaction();
            transaction.replace(R.id.container, fragment);
            transaction.addToBackStack(null);
            transaction.commit();
        }
    });

这是我的片段之一:

 private void setupBottomNavigationView(){
    Log.d(TAG, "setupBottomNavigationView: Setting up BottomNavigationView");
    BottomNavigationViewEx bottomNavigationViewEx = getView().findViewById(R.id.bottom_navigation);
    BottomNavigationViewHelper.setupBottomNavigationView(bottomNavigationViewEx);
    BottomNavigationViewHelper.enableNavigation(getContext(), bottomNavigationViewEx, getFragmentManager());
    Menu menu = bottomNavigationViewEx.getMenu();
    MenuItem menuItem = menu.getItem(ACTIVITY_NUM);
    menuItem.setChecked(true);


}

【问题讨论】:

    标签: android android-fragments android-activity bottomnavigationview


    【解决方案1】:

    我认为您可能会收到NullPointerException,因为您正在尝试访问片段的片段管理器,然后才将其首先分配给一个片段管理器。

    因此,您需要使用活动提供的那个。因此,在您的 loadFragment 方法中执行以下操作:

    之前:

    private void loadFragment(Fragment fragment) {
                // load fragment
                FragmentTransaction transaction = fragment.getFragmentManager().beginTransaction();
                transaction.replace(R.id.container, fragment);
                transaction.addToBackStack(null);
                transaction.commit();
            }
    

    之后:

     private void loadFragment(Fragment fragment) {
                    // load fragment
                    FragmentTransaction transaction = supportFragmentManager.beginTransaction();
                    transaction.replace(R.id.container, fragment);
                    transaction.addToBackStack(null);
                    transaction.commit();
                }
    

    【讨论】:

    • BottomNavigationViewHelper.this 不能从静态上下文中引用
    • 刚刚再次查看您的代码,发现您的 enableNavigation() 方法为您提供了一个名为“supportFragmentManager”的 FragmentManager 实例。请使用它而不是调用 getFragmentManager()
    • 仍然无法从静态上下文中引用 BottomNavigationViewHelper.this
    • 我已经更新了我的答案代码,以证明我在上一条评论中的意思。
    【解决方案2】:
    /**
     * Return the FragmentManager for interacting with fragments associated
     * with this fragment's activity.  Note that this will be non-null slightly
     * before {@link #getActivity()}, during the time from when the fragment is
     * placed in a {@link FragmentTransaction} until it is committed and
     * attached to its activity.
     *
     * <p>If this Fragment is a child of another Fragment, the FragmentManager
     * returned here will be the parent's {@link #getChildFragmentManager()}.
     */
    @Nullable
    final public FragmentManager getFragmentManager() {
        return mFragmentManager;
    }
    

    如果您尝试从未附加到活动的片段中获取片段管理器,您的片段管理器将返回 null。所以改变你的代码

    FragmentTransaction transaction = fragment.getFragmentManager().beginTransaction();
    

    收件人

    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    

    【讨论】:

    • getFragmentManager() 无法从静态上下文中引用
    • 从您的代码中删除静态类 enablenaviogation。 public static void enableNavigation(Context context,......)改成public void enableNavigation(Context context,......)
    • 类必须是静态的,因为我正在使用这个库github.com/ittianyu/BottomNavigationViewEx
    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    相关资源
    最近更新 更多