使用导航组件为片段添加后退箭头

问题描述 投票:0回答:1

我在一个应用程序上实现了一个基本的导航组件,该组件由一个简单的应用程序组成。主要活动 拥有 工具栏 (我已经添加了有后箭头功能)和一个片段容器,它以 片段A. 在这个片段中,我有一个按钮,它重定向到一个空白的 片段B.

我可以回到 碎片A (自 碎片B)从底部的Android导航使用导航组件,但我想做同样的使用从我已经添加的工具栏的背面箭头。我实现了将箭头 setSupportActionBar(findViewById(R.id.toolbar))主要活动(activity as AppCompatActivity).supportActionBar?setDisplayHomeAsUpEnabled(true) 关于 片段B但当我点击它时,它并没有重定向到。片段A 因为(我想)后面的栈是空的。

主要活动

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setSupportActionBar(findViewById(R.id.toolbar))
}

MainActivity xml

<androidx.appcompat.widget.Toolbar
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimary"
    android:minHeight="?attr/actionBarSize"
    android:theme="?attr/actionBarTheme"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<androidx.fragment.app.FragmentContainerView
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:defaultNavHost="true"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/toolbar"
    app:navGraph="@navigation/nav_graph" />

FragmentB

 override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    (activity as AppCompatActivity).supportActionBar?.setDisplayHomeAsUpEnabled(true)
}

增加了这个功能,可以在 风格.xml

<item name="windowNoTitle">true</item>

FragmentB 上键不工作碎片B,背面不工作

我想用 导航组件,有什么想法吗?

谢谢,我在一个应用程序上实现了一个基本的导航组件,该组件由一个MainActivity组成,该MainActivity拥有一个Toolbar(我已经添加了反向箭头功能)和一个片段容器,它开始...

android kotlin navigation components
1个回答
0
投票

在你的 主要活动

设置您的导航。

    private fun setupNavigation() {
    val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment?
    navController = navHostFragment!!.navController
    appBarConfiguration = AppBarConfiguration.Builder(setOf(R.id.checklocation,R.id.questions,R.id.news,R.id.profile_tab)).build()
    NavigationUI.setupWithNavController(bottomNavigation,navController)
    NavigationUI.setupActionBarWithNavController(this,navController)
}

启用后退箭头显示,并显示上一个目的地。重写此功能

    override fun onSupportNavigateUp(): Boolean {
    return navController.navigateUp()
}

顺便说一下,使用底部导航组件,我们不需要配置你的工具栏,这将通过在你的MainActivity中添加上面的dunctions来处理。


0
投票

多亏了@MustafaKhaled,我找到了正确的文档,就在这个文档里。联系

我删除了 setDisplayHomeAsUpEnabled 的代码 (你不需要在这个片段中添加任何东西)。

我留下的是 风格.xml.

我的新 主要活动 是这样的。

private lateinit var toolbar: Toolbar

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    toolbar = findViewById(R.id.toolbar)
    setupNavigation()
}

private fun setupNavigation() {
    val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    val navController = navHostFragment.navController
    val appBarConfiguration = AppBarConfiguration.Builder(navController.graph).build()
    toolbar.setupWithNavController(navController, appBarConfiguration)
}

按照这种方式,你可以通过工具条的 导航-用户界面 功能。


更新280420

有一种比这更简单的方法,不需要工具栏,因为使用了默认的工具栏。

主活动

class MainActivity : AppCompatActivity() {
private lateinit var appBarConfiguration: AppBarConfiguration
private lateinit var navController: NavController

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    setupNavigation()
}

private fun setupNavigation() {
    val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
    navController = navHostFragment.navController
    appBarConfiguration = AppBarConfiguration.Builder(navController.graph).build()
    setupActionBarWithNavController(navController, appBarConfiguration)
}

override fun onSupportNavigateUp(): Boolean {
    return navController.navigateUp(appBarConfiguration)
            || super.onSupportNavigateUp()
}

}

activity_main.xml

<androidx.constraintlayout.widget.ConstraintLayout 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/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent">

<fragment
    android:id="@+id/nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:defaultNavHost="true"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:navGraph="@navigation/nav_graph" />

而我的 风格.xml 文件和默认文件一样。

 <!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <!-- Customize your theme here. -->
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
</style>

更新后的Repo 联系

© www.soinside.com 2019 - 2024. All rights reserved.