当前位置: 首页 > 知识库问答 >
问题:

如何在android studio中更改底部导航菜单中的片段和选定项

杜骏祥
2023-03-14

我希望我的应用程序更改片段视图和底部导航菜单中的选定项目。我尝试过这样做:

private void replaceFragment(Fragment fragment){
        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.replace(R.id.frameLayout,fragment);
        fragmentTransaction.commit();
    }

它改变了片段,但在底部导航菜单中选择的项目没有改变。我试着做了startActivity(newintent(activity.this,destination.class)) 但它不适合应用程序,因为它还刷新底部导航菜单,这不是我想要的。我想要的是底部导航菜单中的片段和所选项目都更改。

这是按钮所在的片段

单击“立即预订”按钮时,我希望应用程序转到此处:

这就是我想要它去的地方

如图所示,片段已更改,但所选项目未更改。这就是我在使用replaceFragment代码时执行replaceFragment代码的时候


共有1个答案

柴兴修
2023-03-14

您可以在此工作中使用Jet pack导航组件中的底部导航视图实现。它简单明了。默认情况下,底部导航将处理所有选定的项目用例。您也可以轻松自定义它。在这里,我为底部导航设置添加了静态编程语言示例。步骤01:将以下依赖项添加到应用程序的build.gradle文件中:

dependencies {
  val nav_version = "2.4.2"

  // Java language implementation
  implementation("androidx.navigation:navigation-fragment:$nav_version")
  implementation("androidx.navigation:navigation-ui:$nav_version")

  // Kotlin
  implementation("androidx.navigation:navigation-fragment-ktx:$nav_version")
  implementation("androidx.navigation:navigation-ui-ktx:$nav_version")

}

步骤02:作为应用程序主要活动的一部分,通过XML添加NavHostFraank:

<?xml version="1.0" encoding="utf-8"?>
<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:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

   <com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/nav_view"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginStart="0dp"
    android:layout_marginEnd="0dp"
    android:background="?android:attr/windowBackground"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:menu="@menu/bottom_navigation_menu" />

<fragment
    android:id="@+id/nav_host_fragment_activity_main"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    app:defaultNavHost="true"
    app:layout_constraintBottom_toTopOf="@id/nav_view"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:navGraph="@navigation/main_nav_graph" />
</androidx.constraintlayout.widget.ConstraintLayout>

步骤03:从主活动OnCreate()初始化底部导航视图和导航控制器

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityMainBinding.inflate(LayoutInflater.from(this))
        setContentView(binding.root)
        val navView : BottomNavigationView = binding.navView
        val navController = findNavController(R.id.nav_host_fragment_activity_main)
        navView.setupWithNavController(navController)
     
       // Get bottom nav listener
        navController.addOnDestinationChangedListener 
        { _, destination, _ ->
            when (destination.id) {
                R.id.A_Fragment -> {
                    // Add your requirement here base with destination
                }
                else -> {
                    // Add your requirement here
                }
            }

            // Manage bottom nav visibility and etc
            if (destination.id in arrayOf(
                    R.id.A_Fragment,
                    R.id.B_Fragment,
                    R.id.C_Fragment
            )) {
                navView.visibility = View.VISIBLE
                this.supportActionBar?.show()
                setupToolbar()
            }
            else {
                navView.visibility = View.GONE
                this.supportActionBar?.hide()
                // No Toolbar

            }
        }

}

您还可以使用此实现使用导航图定义目的地。如果您需要添加或自定义底部奈文视图项目徽章,您可以使用以下示例乐趣:

private fun setupBadge(bottomNavigationView: BottomNavigationView) {
        val menu: Menu = bottomNavigationView.menu
        val your_A_MenuItem: MenuItem = menu.getItem(1)
        val your_B_MenuItem: MenuItem = menu.getItem(2)
        val your_A_Badge = bottomNavigationView.getOrCreateBadge(your_A_MenuItem.itemId)
      
        val your_B_Badge = bottomNavigationView.getOrCreateBadge(your_B_MenuItem.itemId)
// Add numbers
your_A_Badge.number = 10
your_A_Badge.isVisible = true
        
    }
 类似资料:
  • 我创建了一个带有“底部导航活动”的新项目: 这是生成的代码: 如何使用底部栏更改为新片段?例如,我有3个片段:Fragment1 Fragment2和Fragment3,我想用底部栏中的3个按钮更改为它们。我还想通过左右滑动手指来切换片段,我该怎么做?

  • 我有一个按钮,让我改变片段,它成功地做到了这一点。我打开了新片段,但底部的导航菜单并没有改变它的样式。这是一个简单的底部导航菜单,因为它是,当您选择当前正在查看的片段时,它会使底部的片段文本变大,图标也变大。这就是问题所在,它不会改变菜单。 信息片段: 主要活动:

  • 问题内容: 我是Android编程的新手,但是到目前为止一直表现不错。我已经读过很多关于这个问题的答案,但似乎无法使我的工作正常。基本上,我拥有的是带有导航抽屉的MainActivity。我有两个用相应的片段布局xmls正确初始化的片段。目前,我可以在启动应用程序时以及在单击抽屉中的每个项目时显示我的第一个片段;标题会发生变化;但是,片段保持不变。有什么建议?我认为相关的代码在下面(未显示的是Na

  • 在我的应用程序中,我有5个片段。我使用底部导航来管理它们。但在第一个片段中,我有回收器视图,当我单击回收器项目时,我需要在此选项卡(第一个选项卡)中打开第二个片段。 现在,当我试图打开第二个片段时,他打开了所有标签上方。 这就是我如何打开第二个碎片

  • 我的主要活动中有一个底部导航栏。通过单击底部导航中的一个选项卡,我想更改视图中的片段。我有以下代码:主要活动: } 我的一个片段: 如果我单击其中一个选项卡,就会显示正确的片段,因此这是可行的。然而,当新片段出现时,我想单击另一个选项卡来显示另一个片段,这就行不通了。底部导航栏不会对单击做出反应。甚至日志。i语句不起作用,因此似乎没有调用导航项SelectedListener。 我对android

  • 我正在创建和应用程序,到目前为止一切都很好。今天,我处理一个片段中的数据,以访问我的webservice并返回json,然后将该数据插入到我的sqlite中,然后在listview中显示该数据并逐秒更新数据。 一切都是正确的,直到我发现如果我在底部导航中单击片段中的项目的位置过快,它将在应用程序对片段执行事务时崩溃。只有当我在该片段和其他4个片段中的多个片段之间单击时,才会发生这种情况。 所以我的