【问题标题】:Android Navigation - Removing Action Bar Back Button When Popping Back StackAndroid导航 - 弹出返回堆栈时删除操作栏后退按钮
【发布时间】:2020-08-27 05:40:49
【问题描述】:

我要做什么

我正在使用 Android Navigation 组件来处理我的应用程序中的导航。在这个例子中,我有两个屏幕,屏幕 A 和屏幕 B。 我希望用户能够单击屏幕 A 中的按钮并能够导航到屏幕 B;然后被阻止返回上一个屏幕(屏幕 A)。

问题

当用户从屏幕 A 导航到屏幕 B 时,操作栏上的后退按钮仍然允许用户返回到上一个屏幕,但是当单击底部栏中的后退按钮时,它会退出应用程序,所以这部分工作正常。

要删除操作栏中的后退按钮,我需要做什么?

到目前为止我读到的内容

我已遵循这三篇文章中的指导,但我认为他们可能忽略了ActionBar 的后退按钮:

我的代码

导航图 - nav_graph.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"
    android:id="@+id/nav_graph"
    app:startDestination="@id/screen_a">
    <fragment
        android:id="@+id/screen_a"
        android:name="com.example.conditionalnavigation.AFragment"
        android:label="screen A">
        <action
            android:id="@+id/action_AFragment_to_BFragment"
            app:destination="@id/screen_b"
            app:launchSingleTop="true"
            app:popUpTo="@id/screen_a"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/screen_b"
        android:name="com.example.conditionalnavigation.BFragment"
        android:label="screen B" />
</navigation>

MainActivity - 这充当我的 Single Activity 导航主机。

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        DataBindingUtil.setContentView<ActivityMainBinding>(this, R.layout.activity_main)
        val navController = this.findNavController(R.id.myNavHostFragment)

        NavigationUI.setupActionBarWithNavController(this, navController)
    }

    override fun onSupportNavigateUp(): Boolean {
        val navController = this.findNavController(R.id.myNavHostFragment)
        return navController.navigateUp()
    }
}

【问题讨论】:

    标签: android kotlin android-navigation back-stack android-jetpack-navigation


    【解决方案1】:

    在您的活动类中添加以下成员(在 Kotlin 中):

    private lateinit var appBarConfiguration: AppBarConfiguration
    

    在 onCreate 方法中添加以下行:

    ....
    val drawerLayout: DrawerLayout = findViewById(R.id.drawer_layout)
    ...
    ...
    appBarConfiguration = AppBarConfiguration(
                setOf([**ID of the fragment layout you want without back button**],                
                ), drawerLayout
            )
    
    setupActionBarWithNavController(navController, appBarConfiguration)
    navView.setupWithNavController(navController)
    
        ....
    

    这样,您的片段将成为根片段,并且后退按钮被移除。希望对您有所帮助。

    【讨论】:

    • 很高兴知道:-)
    【解决方案2】:

    尝试在创建屏幕b片段时禁用主页按钮:

    override fun onCreateView(inflater: LayoutInflater?, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        var rootView = inflater?.inflate(R.layout.fragment_screen_b, container, false)
         (activity as AppCompatActivity).supportActionBar!!.setDisplayHomeAsUpEnabled(false)
    
        return rootView
    }
    

    如果还是不行,那就用onViewCreated()方法试试吧。

    如果不起作用,请尝试在下面添加:

    setHasOptionsMenu(false)
    

    【讨论】: