如何手动为底部导航栏设置StartDestiantion

时间:2020-07-23 18:32:18

标签: android bottomnavigationview navigationview

我正在尝试为startDestination手动设置底部导航栏。

共有5页,每页内都有一个活动。

例如,我选择了菜单3 并打开了片段,

现在在“片段活动”中,我单击了button,这将打开一个新的活动

通常,在正常活动中,当我们按返回键在活动之间进行浏览时,如果未设置方法onBackPress,则会返回到上一个活动。

但是,在这里,当我按下返回键打开活动后,它会打开菜单1 而不是菜单3 ,因为菜单在我单击Button打开其他活动之前,单击了3。

这是我试图避免发生的代码,因此,我通过Intent传递了一个String键,当我按下 BackKey 时,它打开了菜单1 ,因此我要在初始化{strong> NavigationView 的地方开始HomePage,并在加载页面之前先设置startDestination

这是我的代码:

 private void navigationInit() {

    SharedPreferences sharedPreferences= getSharedPreferences("HOME",MODE_PRIVATE);
    String homePage= sharedPreferences.getString("home","");
    
     if (!homePage.equals("none")){
        type= getIntent().getStringExtra("type");
    }else{
        type=homePage;
    }
    
    if (type.equals("restaurant")){

        navigationView= findViewById(R.id.Bottom_Nav_Bar);
        navigationControler= Navigation.findNavController(HomePage.this,R.id.nav_graph_fragment);
        navigationView.setItemIconTintList(null);
        NavGraph navGraph = navigationControler.getNavInflater().inflate(R.navigation.nav_graph);
        navGraph.setStartDestination(R.id.homeFragment);
        navGraph.getStartDestination();
        NavigationUI.setupWithNavController(navigationView,navigationControler);


    }
    else if (type.equals("drinks")){

        navigationView= findViewById(R.id.Bottom_Nav_Bar);
        navigationControler= Navigation.findNavController(HomePage.this,R.id.nav_graph_fragment);
        navigationView.setItemIconTintList(null);
        NavGraph navGraph = navigationControler.getNavInflater().inflate(R.navigation.nav_graph);
        navGraph.setStartDestination(R.id.drinksFragment);
        navGraph.getStartDestination();
        NavigationUI.setupWithNavController(navigationView,navigationControler);



    }
    else if (type.equals("profile")){

        navigationView= findViewById(R.id.Bottom_Nav_Bar);
        navigationControler= Navigation.findNavController(HomePage.this,R.id.nav_graph_fragment);
        navigationView.setItemIconTintList(null);
        NavGraph navGraph = navigationControler.getNavInflater().inflate(R.navigation.nav_graph);
        navGraph.setStartDestination(R.id.profileFragment);
        navGraph.getStartDestination();
        NavigationUI.setupWithNavController(navigationView,navigationControler);



    }
    else if (type.equals("recent"))
    {
        navigationView= findViewById(R.id.Bottom_Nav_Bar);
        navigationControler= Navigation.findNavController(HomePage.this,R.id.nav_graph_fragment);
        navigationView.setItemIconTintList(null);
        NavGraph navGraph = navigationControler.getNavInflater().inflate(R.navigation.nav_graph);
        navGraph.setStartDestination(R.id.recentOrderFragment);
        navGraph.getStartDestination();
        NavigationUI.setupWithNavController(navigationView,navigationControler);

    }
    else
    {
        navigationView= findViewById(R.id.Bottom_Nav_Bar);
        navigationControler= Navigation.findNavController(HomePage.this,R.id.nav_graph_fragment);
        navigationView.setItemIconTintList(null);
        NavigationUI.setupWithNavController(navigationView,navigationControler);
    }
} 

即使我更改此默认代码一样的代码:

    navigationView= findViewById(R.id.Bottom_Nav_Bar);
    navigationControler= 
    Navigation.findNavController(this,R.id.nav_graph_fragment);
    navigationView.setItemIconTintList(null);
    NavigationUI.setupWithNavController(navigationView,navigationControler);

我仍然得到相同的结果。

每个ifelse语句中的代码都是多余的,以确保它们可以正常工作。

但是,问题在于.setStartDestination被突出显示了,而我已经检查过它说 navGraph.getStartDestination()的结果被忽略

这是我的HomePage.xml的代码:

<RelativeLayout 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:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".home.HomePage">

<fragment
    android:id="@+id/nav_graph_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:defaultNavHost="true"
    android:layout_above="@+id/Bottom_Nav_Bar"
    app:navGraph="@navigation/nav_graph" />

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/Bottom_Nav_Bar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="0dp"
    android:background="?android:attr/selectableItemBackground"
    app:menu="@menu/bottom_nav_menu_item"/>

有人可以帮我吗,谢谢!!!

这是我尝试按 BACKKEY 时要获得结果的图像,但是它返回到默认开始。

enter image description here

这里有两种情况,首先我按绿色菜单,然后按 ViewMore 活动已打开,但是当我按返回键时会返回到第一个活动。

在第二种情况下,当我按返回键时,它将返回到上一个活动,即绿色活动。

我正在尝试实现第二种情况,但是当我按后退按钮时,它会返回到第一个菜单

1 个答案:

答案 0 :(得分:1)

代替使用

NavGraph navGraph = navigationControler.getNavInflater().inflate(R.navigation.nav_graph); navGraph.setStartDestination(R.id.homeFragment); navGraph.getStartDestination();

我在onResume方法上使用了navigationController.navigate(R.id.drinksFragment);,与上面的代码相同。

类似这样的东西:

navigationView= findViewById(R.id.Bottom_Nav_Bar); navigationControler= Navigation.findNavController(HomePage.this,R.id.nav_graph_fragment); navigationView.setItemIconTintList(null); NavigationUI.setupWithNavController(navigationView,navigationControler); 主要活动中

和onResume方法:

我上面与sharedPreference一起使用的相同代码以及if和else仅包含

navigationController.navigate(R.id.DesiredFragment);随条件而变化。

终于可以解决我的问题了。