使用Android导航组件在底部导航中阻止圆形片段堆栈

时间:2019-06-01 19:17:31

标签: android android-fragments android-architecture-components android-architecture-navigation android-bottomnav

我正在将Android导航组件与底部导航视图一起使用。

我的底部导航视图中有3个片段,片段-A,B和C。

预期的行为:
要退出应用,请按任意片段。

观察到的行为: A-> B-> C-> A-> B->后退-> A->后退-> C->后退B->后退A->后退->退出。

(为底部导航片段添加了片段堆栈) 如何实现我的预期行为?

我的问题与开发人员文档中的问题相同,但我在底部导航视图中找到了它:
https://developer.android.com/guide/navigation/navigation-getting-started#popupto_example_circular_logic

代码:

底部导航视图设置:

// Setup bottom navigation view
private fun setUpBottomNavigationView() {


    // Nav host fragment
    val host: NavHostFragment = supportFragmentManager
        ?.findFragmentById(R.id.main_activity_nav_host_fragment) as NavHostFragment

    // Set up Action Bar
    val navController = host.navController

    // Setup bottom navigation view
    mainActivityBinding.mainActivityBottomNavigationView.setupWithNavController(navController)
}

导航图:

<?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/activity_navigation"
    app:startDestination="@id/homeFragment">

    <fragment
        android:id="@+id/homeFragment"
        android:name="com.app.view.main.home.HomeFragment"
        android:label="home_fragment"
        tools:layout="@layout/home_fragment" />

    <fragment
        android:id="@+id/settingsFragment"
        android:name="com.app.view.main.settings.SettingsFragment"
        android:label="settings_fragment"
        tools:layout="@layout/settings_fragment" />

    <fragment
        android:id="@+id/statisticsFragment"
        android:name="com.app.view.main.statistics.StatisticsFragment"
        android:label="statistics_fragment"
        tools:layout="@layout/statistics_fragment" />

</navigation>

底部导航菜单:

<?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/homeFragment"
        android:icon="@drawable/ic_home_black_24dp"
        android:title="@string/home"
        app:showAsAction="ifRoom" />

    <item
        android:id="@+id/statisticsFragment"
        android:icon="@drawable/ic_assessment_black_24dp"
        android:title="@string/statistics"
        app:showAsAction="ifRoom" />

    <item
        android:id="@id/settingsFragment"
        android:icon="@drawable/ic_settings_black_24dp"
        android:title="@string/settings"
        app:showAsAction="ifRoom" />

</menu>

2 个答案:

答案 0 :(得分:0)

'在您的主要活动中覆盖onbackpress方法并像这样完成活动。'

@Override
    public void onBackPressed() {

        finish();

    }

“这将解决您的问题”

答案 1 :(得分:0)

在这种情况下,您需要将登录流程设置为主导航图内的嵌套图。

您的起始目的地应该分配给连接到BottomNavigationView的3个片段之一,以便按 Back 可以使用户进入此屏幕,然后退出该应用程序。

在您的HomeFragment(开始目标)中,您可以检查用户是否已登录,并在需要时导航到嵌套的登录图。

HomeFragment.kt

if (!isLoggedIn) {
    val action = HomeFragmentDirections.showLogin()
    findNavController().navigate(action)
} else {
    // show bottom nav
}

您必须根据需要处理{/ {1}}的隐藏/显示。

您更新后的导航图将如下所示:

main_nav.xml

BottomNavigationView