gpt4 book ai didi

android - 如何使android导航主机与BottomNavigationView一起使用?

转载 作者:行者123 更新时间:2023-12-02 13:32:43 30 4
gpt4 key购买 nike

我想使用新的导航图和BottomNavigationView。我有以下依赖项:

// Navigation
implementation "androidx.navigation:navigation-fragment-ktx:$navVersion"
implementation "androidx.navigation:navigation-ui-ktx:$navVersion"
implementation "androidx.fragment:fragment:1.2.2"

// Material
implementation "com.google.android.material:material:$materialVersion"

请注意 implementation "androidx.fragment:fragment:1.2.2",它应该修复由于 FragmentContainerView未在导航图中显示为主机而发生的错误。

这是我的简单导航图:

enter image description here

您在这里看到的第一个奇怪的事情是,即使我添加了可以修复它的依赖项,也没有任何内容显示为主机。

我的主要 Activity 布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
tools:context=".MainActivity">

<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
app:defaultNavHost="true"
app:navGraph="@navigation/navigation_graph" />

<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?colorPrimary"
app:itemIconTint="@drawable/menu_navigation"
app:itemTextColor="@drawable/menu_navigation"
app:menu="@menu/menu_navigation" />

</LinearLayout>

和我的主要 Activity kotlin文件:
class MainActivity : AppCompatActivity() {

private var navController: NavController? = null
private var appBarConfiguration: AppBarConfiguration? = null

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

navController =
(supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment).navController

appBarConfiguration = AppBarConfiguration.Builder(
setOf(
R.id.main_fragment,
R.id.recycler_fragment,
R.id.map_fragment
)
).build()

setupActionBar()
setupBottomNavigationMenu()
}

private fun setupActionBar() {
NavigationUI.setupActionBarWithNavController(
this,
navController!!,
appBarConfiguration!!
)
}

private fun setupBottomNavigationMenu() {
bottom_navigation?.let {
NavigationUI.setupWithNavController(it, navController!!)
}
}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.menu_toolbar, menu)

return true
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
val navigated = NavigationUI.onNavDestinationSelected(item, navController!!)

return navigated || super.onOptionsItemSelected(item)
}
}

这边还有菜单和工具栏:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<item
android:id="@+id/destination_home"
android:icon="@drawable/ic_home"
android:title="@string/home"
tools:layout="@layout/fragment_main" />
<item
android:id="@+id/destination_recycler"
android:icon="@drawable/ic_list"
android:title="@string/recycler"
tools:layout="@layout/fragment_recycler" />
<item
android:id="@+id/destination_map"
android:icon="@drawable/ic_map"
android:title="@string/map"
tools:layout="@layout/fragment_map" />
</menu>
<?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/destination_settings"
android:icon="@drawable/ic_settings"
android:title="@string/settings"
app:showAsAction="ifRoom" />
</menu>

当我现在启动应用程序时,我会期望以下行为:
  • 该应用程序启动并显示带有文本“Home”的片段
  • 该应用程序不会在工具栏
  • 中显示后退按钮
  • 当我从“主页”导航到“ map ”时,工具栏不会在工具栏中显示返回按钮
  • 当我从“主页”导航到“设置”时,工具栏将在工具栏中显示后退按钮
  • 当我从“设置”导航回来时,“主页”屏幕应出现
  • 当我从“ map ”导航到“设置”时,工具栏将在工具栏中显示后退按钮
  • 当我从“设置”导航回来时,“ map ”屏幕现在应该出现

  • 实际发生的是:
  • 该应用程序启动并显示带有文本“Home”的片段
  • 该应用程序在工具栏
  • 中显示一个后退按钮
  • 当我从“主页”导航到“ map ”时,工具栏确实在工具栏中显示了后退按钮
  • 当我从“主页”导航到“设置”时,工具栏在工具栏中显示了一个后退按钮
  • 当我从“设置”导航返回时,“主页”屏幕出现
  • 当我从“ map ”导航到“设置”时,工具栏在工具栏中显示了后退按钮
  • 当我从“设置”导航而不是“ map ”时,出现“主页”屏幕

  • 因此,这里的导航确实有些混乱,我不知道如何解决。

    最佳答案

    首先,您将R.id.main_fragment, R.id.recycler_fragment, R.id.main_fragment传递给AppBarConfiguration-除了两次包含main_fragment之外,这些名称与菜单XML中的destination_homedestination_recyclerdestination_map不匹配。由于单击底部导航栏会起作用,因此,这些似乎是正确的目标ID,因此您应该更改AppBarConfiguration以使用相同的ID:

    appBarConfiguration = AppBarConfiguration.Builder(
    setOf(
    R.id.destination_home,
    R.id.destination_recycler,
    R.id.destination_map
    )
    ).build()

    或者,如果您使用 navigation-ui-ktx Artifact ,则可以使用 top level AppBarConfiguration creator:
    appBarConfiguration = AppBarConfiguration(setOf(
    R.id.destination_home,
    R.id.destination_recycler,
    R.id.destination_map))

    按照 onNavDestinationSelected() Javadoc:

    By default, the back stack will be popped back to the navigation graph's start destination. Menu items that have android:menuCategory="secondary" will not pop the back stack.



    因此,可以预期的是,如果您在菜单中的“设置”屏幕中没有XML,则在您单击“后退”按钮时将使您返回到图形的起始目标。您想要更改菜单XML以包括该标志:
        <?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/destination_settings"
    android:icon="@drawable/ic_settings"
    android:title="@string/settings"
    app:showAsAction="ifRoom"
    android:menuCategory="secondary" />
    </menu>

    关于android - 如何使android导航主机与BottomNavigationView一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60355856/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com