关于kotlin:Android导航-在弹出后退堆栈时删除操作栏后退按钮

Android Navigation - Removing Action Bar Back Button When Popping Back Stack

我要做什么

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

问题

当用户从屏幕A导航到屏幕B时,操作栏上的"后退"按钮仍允许用户返回上一屏幕,但是,当单击底部栏中的"后退"按钮时,它将退出应用程序,因此零件正常。

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

enter

导航图-nav_graph.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?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-这充当我的"单活动"导航主机。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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()
    }
}

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

1
private lateinit var appBarConfiguration: AppBarConfiguration

在onCreate方法内添加以下行:

1
2
3
4
5
6
7
8
9
10
11
12
13
....
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)

    ....

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


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

1
2
3
4
5
6
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()方法。

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

1
setHasOptionsMenu(false)