Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-导航组件,具有用于底部导航的多个菜单_Android_Android Architecture Navigation_Android Navigation_Android Bottomnav - Fatal编程技术网

Android-导航组件,具有用于底部导航的多个菜单

Android-导航组件,具有用于底部导航的多个菜单,android,android-architecture-navigation,android-navigation,android-bottomnav,Android,Android Architecture Navigation,Android Navigation,Android Bottomnav,我有一个Android应用程序(Java),它使用导航组件设置底部导航。该应用程序由单个活动(主)组成,其他所有内容都以片段形式加载 其想法是启动启动屏幕,检查用户是否登录。如果用户已登录,则会加载主屏幕并显示底部导航(以前隐藏) 底部导航由3个选项卡组成 但是,当用户登录时,它可以是两种类型的用户之一。如果他是订户,他可以访问应用程序的所有部分。但是,如果用户是访问者,则只能访问两个部分。在这种情况下,我希望有一个不同的底部导航菜单,只有2个选项卡可见 如果已在主活动中分配了主底部导航,如何根

我有一个Android应用程序(Java),它使用导航组件设置底部导航。该应用程序由单个活动(主)组成,其他所有内容都以片段形式加载

其想法是启动启动屏幕,检查用户是否登录。如果用户已登录,则会加载主屏幕并显示底部导航(以前隐藏)

底部导航由3个选项卡组成

但是,当用户登录时,它可以是两种类型的用户之一。如果他是订户,他可以访问应用程序的所有部分。但是,如果用户是访问者,则只能访问两个部分。在这种情况下,我希望有一个不同的底部导航菜单,只有2个选项卡可见

如果已在主活动中分配了主底部导航,如何根据用户类型替换底部导航

这是主活动中的代码:

    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);


    FragmentManager supportFragmentManager = getSupportFragmentManager();
    NavHostFragment navHostFragment = (NavHostFragment) supportFragmentManager.findFragmentById(R.id.nav_host_fragment);
    NavController navController = navHostFragment.getNavController();

    AppBarConfiguration appBarConfiguration = new AppBarConfiguration.Builder(R.id.homeFragment, R.id.libraryFragment, R.id.searchFragment, R.id.myStuffFragment).build();
    NavigationUI.setupWithNavController(toolbar, navController, appBarConfiguration);

    BottomNavigationView bottomNav = findViewById(R.id.bottom_nav);
    NavigationUI.setupWithNavController(bottomNav, navController);


    navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
        @Override
        public void onDestinationChanged(@NonNull NavController controller, @NonNull NavDestination destination, @Nullable Bundle arguments) {
            if (destination.getId() == R.id.splashScreenFragment || destination.getId() == R.id.welcomeFragment || destination.getId() == R.id.signInFragment) {
                toolbar.setVisibility(View.GONE);
                bottomNav.setVisibility(View.GONE);
            } else if (destination.getId() == R.id.audioPlayerFragment) {
                bottomNav.setVisibility(View.GONE);
            } else {
                toolbar.setVisibility(View.VISIBLE);
                bottomNav.setVisibility(View.VISIBLE);
            }
        }
    });
这是SplashScreenFragment中的代码(这是导航图中的startDestination):


默认情况下,您可以在
BottomNavigationView
中拥有完整的菜单项,因此当订阅用户登录时,不需要更改菜单

如果用户未订阅,则可以使用
removietem()

因此,在
MainActivity
中添加一个条件:

if (notSubscribedUser) {
    if (bottomNav.getMenu().findItem(R.id.my_item_id) != null)
        bottomNavigationView.getMenu().removeItem(R.id.my_item_id);
}

并对所有要删除的菜单项ID执行相同的操作

,那么您的问题是什么?如何更改
底部导航视图中可见的菜单项?这与导航无关,只是使用
菜单
API。@ianhanniballake如果用户不是订阅者,底部菜单将与订阅者底部菜单完全不同。那么,如何根据用户类型使用导航组件和两个不同的底部菜单呢?导航与您在
BottomNavigationView
中显示的菜单无关-这就是为什么
menu.xml
完全独立于您的导航图xml。您是否在询问如何根据什么类型的用户为您的
BottomNavigationView
膨胀不同的菜单?我如何从SplashScreenFragment调用MainActivity,它正在处理已订阅与未订阅的情况?您可以调用
requirectivity()
中的SplashScreenFragment
并将其强制转换为MainActivity。。类似于
MainActivity=(MainActivity)requireAction()
然后将上面的代码放在某种方法中,例如
checkSubscription
并用
activity.checkSubscription()调用它
if (notSubscribedUser) {
    if (bottomNav.getMenu().findItem(R.id.my_item_id) != null)
        bottomNavigationView.getMenu().removeItem(R.id.my_item_id);
}