Android Jetpack导航组件手柄导航控制器,带底部导航和it';s后堆栈导航

Android Jetpack导航组件手柄导航控制器,带底部导航和it';s后堆栈导航,android,android-fragments,bottomnavigationview,android-architecture-navigation,android-architecture,Android,Android Fragments,Bottomnavigationview,Android Architecture Navigation,Android Architecture,您好,我正在开发一个应用程序,我被困在导航视图中的导航 例如,我有活动,内部有如下定义的导航主机控制器 setSupportActionBar(mMainToolbar); mAppBarConfiguration = new AppBarConfiguration.Builder( R.id.homeFragment, R.id.questionBankFragment, R.id.testFragment, R.id.dail

您好,我正在开发一个应用程序,我被困在导航视图中的导航

例如,我有活动,内部有如下定义的导航主机控制器

    setSupportActionBar(mMainToolbar);

    mAppBarConfiguration = new AppBarConfiguration.Builder(
            R.id.homeFragment, R.id.questionBankFragment,
            R.id.testFragment, R.id.dailyHuntFragment,
            R.id.liveClassesFragment)
            .setOpenableLayout(mMainDrawerLayout)
            .build();

    View mNavigationViewHeaderView = mNavigationView.getHeaderView(0);

    mNavHostFragment = getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
    mNavController = Navigation.findNavController(this, R.id.nav_host_fragment);

    NavigationUI.setupActionBarWithNavController(this, mNavController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(mNavigationView, mNavController);

    NavigationUI.setupWithNavController(mMainToolbar, mNavController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(mBottomNavigationView, mNavController);

    mNavController.addOnDestinationChangedListener((controller, destination, arguments) -> {
        switch (destination.getId()) {

            case R.id.homeFragment:
            case R.id.questionBankFragment:
                mMainToolbar.setVisibility(View.VISIBLE);
                mBottomNavigationView.setVisibility(View.VISIBLE);
                setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark));
                setDrawerLocked(false);
                break;


            case R.id.welcomeFragment:
            case R.id.loginFragment:
                mMainToolbar.setVisibility(View.GONE);
                mBottomNavigationView.setVisibility(View.GONE);
                setStatusBarColor(Color.WHITE);
                setDrawerLocked(true);
                break;

        
            case R.id.customModuleFragment:
            case R.id.createCustomModuleOneFragment:
            case R.id.createCustomModuleTwoFragment:
                mBottomNavigationView.setVisibility(View.GONE);
                setDrawerLocked(true);
                break;
            case R.id.logoutFragment:

                new AppSharedPreference(MainActivity.this).clearAllData();

                Intent intent = new Intent(getApplicationContext(), UserAuthanticationActivity.class);
                startActivity(intent);
                finish();
                break;

        }
    });
它工作得很好。但现在我必须处理我无法理解的后堆栈上的导航

我的问题是假设我是底部导航,有4个菜单。家,狩猎,银行,考试

我被选为Qbank。Qbank有5个片段A、B、C、D、E。现在我已经开始遍历片段A->B B->C C->D

现在我有了选择,我必须回到导演的位置。目前的职位是D

D->A

但我如何才能回到一个堆栈,并清除我穿过A->B->C->D的堆栈,我想清除这个,就像我想从A开始一样

如何使Jetpack导航组件成为可能

我尝试了直接导航或弹出堆栈导航,但它不起作用,它会给我错误,就像我直接导航到

java.lang.IllegalStateException: View androidx.core.widget.NestedScrollView{98060fe VFED..... ......ID 0,0-0,0} does not have a NavController set
        at androidx.navigation.Navigation.findNavController(Navigation.java:84)
        at app.technotech.koncpt.McqTestFragment$2.onClick(McqTestFragment.java:232)
        at android.view.View.performClick(View.java:7201)
        at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
        at android.view.View.performClickInternal(View.java:7170)
        at android.view.View.access$3500(View.java:806)
        at android.view.View$PerformClick.run(View.java:27562)
        at android.os.Handler.handleCallback(Handler.java:883)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7682)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
我不知道如何处理此导航。请帮助我解决此问题


提前感谢。

您可以检查当前的导航目的地,如果这是您的起点或所需的目的地,则弹出包含在内的窗口

    if (navController.currentDestination.id == navController.graph.YOUR_PREFERED_DESTIONATION) {
    
            navController.popBackStack(
                navController.graph.YOUR_PREFERED_DESTIONATION, true
            )
    }else {
   navController.navigate(R.id.other_destination)
}

您可以检查当前导航目的地,如果这是您的开始或所需的目的地,则包括弹出窗口

    if (navController.currentDestination.id == navController.graph.YOUR_PREFERED_DESTIONATION) {
    
            navController.popBackStack(
                navController.graph.YOUR_PREFERED_DESTIONATION, true
            )
    }else {
   navController.navigate(R.id.other_destination)
}
使用popUpTo从backstack中删除上一个片段的实例,并使用PopuptInclusive删除片段的第一个实例,否则堆栈中将有两个片段的实例:

Android官方文档中的演示代码:

导航图XML视图:

<fragment
android:id="@+id/c"
android:name="com.example.myapplication.C"
android:label="fragment_c"
tools:layout="@layout/fragment_c">

<action
    android:id="@+id/action_d_to_a"
    app:destination="@id/a"
    app:popUpTo="@+id/a"
    app:popUpToInclusive="true"/>

使用popUpTo从backstack中删除先前片段的实例,并使用PopuptInclusive删除片段的第一个实例,否则堆栈中将有两个片段的实例

Android官方文档中的演示代码:

导航图XML视图:

<fragment
android:id="@+id/c"
android:name="com.example.myapplication.C"
android:label="fragment_c"
tools:layout="@layout/fragment_c">

<action
    android:id="@+id/action_d_to_a"
    app:destination="@id/a"
    app:popUpTo="@+id/a"
    app:popUpToInclusive="true"/>

您应该为每个底部导航项使用不同的导航图。

这样,每个底部菜单项都会有自己的图形,带有自己的起始目标。因此,遵循这条导航路径

A->B->C->D并添加以下代码-

<action
    android:id="@+id/action_d_to_a"
    app:destination="@id/a"
    app:popUpTo="@+id/a"
    app:popUpToInclusive="true"/>

dashboard_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/dashboard_navigation"
    app:startDestination="@id/dashboardFragment">

    <fragment
        android:id="@+id/dashboardFragment"
        android:name="your.package.DashboardFragment"
        android:label=""
        tools:layout="@layout/fragment_dashboard" >

    </fragment>

    <fragment
        //add other fragment to this graph

    </fragment>

<navigation>
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:id="@+id/coordinatorLayout_main"
    android:background="?android:attr/colorBackground"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="?attr/actionBarSize" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        app:itemTextColor="@drawable/bottom_nav_selector"
        android:id="@+id/bottom_nav_view"
        android:layout_width="match_parent"
        app:itemRippleColor="?colorPrimary"
        app:labelVisibilityMode="labeled"
        android:layout_height="?attr/actionBarSize"
        android:layout_gravity="bottom"
        app:menu="@menu/bottom_nav_menu"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/dashboard_navigation"
        android:icon="@drawable/dashboard_icon_selector"
        android:title="@string/dashboardTitle" />

    <item
        android:id="@+id/find_navigation"
        android:icon="@drawable/find_icon_selector"
        android:title="@string/findTitle" />

    <item
        android:id="@+id/options_navigation"
        android:icon="@drawable/setting_icon_selector"
        android:title="@string/optionTitle" />

</menu>


您应该为每个底部导航项使用不同的导航图。

这样,每个底部菜单项都会有自己的图形,带有自己的起始目标。因此,遵循这条导航路径

A->B->C->D并添加以下代码-

<action
    android:id="@+id/action_d_to_a"
    app:destination="@id/a"
    app:popUpTo="@+id/a"
    app:popUpToInclusive="true"/>

dashboard_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/dashboard_navigation"
    app:startDestination="@id/dashboardFragment">

    <fragment
        android:id="@+id/dashboardFragment"
        android:name="your.package.DashboardFragment"
        android:label=""
        tools:layout="@layout/fragment_dashboard" >

    </fragment>

    <fragment
        //add other fragment to this graph

    </fragment>

<navigation>
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout 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:id="@+id/coordinatorLayout_main"
    android:background="?android:attr/colorBackground"
    tools:context=".MainActivity">

    <FrameLayout
        android:id="@+id/fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginBottom="?attr/actionBarSize" />

    <com.google.android.material.bottomnavigation.BottomNavigationView
        app:itemTextColor="@drawable/bottom_nav_selector"
        android:id="@+id/bottom_nav_view"
        android:layout_width="match_parent"
        app:itemRippleColor="?colorPrimary"
        app:labelVisibilityMode="labeled"
        android:layout_height="?attr/actionBarSize"
        android:layout_gravity="bottom"
        app:menu="@menu/bottom_nav_menu"/>

</androidx.coordinatorlayout.widget.CoordinatorLayout>
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/dashboard_navigation"
        android:icon="@drawable/dashboard_icon_selector"
        android:title="@string/dashboardTitle" />

    <item
        android:id="@+id/find_navigation"
        android:icon="@drawable/find_icon_selector"
        android:title="@string/findTitle" />

    <item
        android:id="@+id/options_navigation"
        android:icon="@drawable/setting_icon_selector"
        android:title="@string/optionTitle" />

</menu>


检查这个@ॐRakeshKumar这是一个基本的导航,我想用底部导航和导航控制器的处理状态来解决这个问题@ॐRakeshKumar这个我想要的基本导航解决方案,带有底部导航和导航控制器的句柄状态,它给出=>没有设置导航控制器。。。。导航错误它给出=>未设置导航控制器。。。。导航错误我要把这个放在哪里?我想这和他在XML中给出的答案一样,我必须把它放在哪里?我认为这与他在XML中给出的上述答案相同。如果我将为底部导航创建每个导航图,那么我将为每个图创建单独的导航主机片段?@vasudevyas主机片段将放置在主活动中,其中的片段可以通过导航图进行更改,我已经上传了主要活动和菜单xml,请检查。`app:startDestination=“fragmentid”`导航图中的标志将决定哪个片段将作为该导航图的起始片段。通常,我们通过底部导航菜单项附加片段id,但对于多个导航图,我们通过其id将导航图附加到底部导航菜单。无法获取导航单击侦听器。。。不知道ITI有什么问题如果我将为底部导航创建每个导航图,那么我必须为每个图创建单独的导航主机片段?@VasudevVyas主机片段将放置在主活动中,其中的片段可以通过导航图进行更改,我已经上传了主要活动和菜单xml,请检查。`app:startDestination=“fragmentid”`导航图中的标志将决定哪个片段将作为该导航图的起始片段。通常,我们通过底部导航菜单项附加片段id,但对于多个导航图,我们通过其id将导航图附加到底部导航菜单。无法获取导航单击侦听器。。。不知道怎么了