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

vhmi4jdf  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(161)

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

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

它改变了片段,但底部导航菜单中的选定项没有改变。我试着做startActivity(new Intent(activity.this, destination.class));,但它不适合应用程序,因为它也刷新了底部导航菜单,这不是我想要的。我想要的是片段和底部导航菜单中的选定项都改变。
this is the fragment where the button is
我希望在单击“立即预订”按钮时应用程序转到此处:
this is where i wanted it to go
正如您在这张图片中看到的,片段发生了变化,但选定的项没有变化。

f0ofjuux

f0ofjuux1#

您可以使用Jet pack Navigation组件中的底部导航视图实现来完成这项工作。它简单明了。底部导航将默认处理所有项目选定的用例。您也可以轻松地自定义它。这里我添加了底部导航设置的Kotlin示例。第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添加NavHostFragment作为应用的主Activity的一部分:

<?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:初始化你的main main activity的底部导航视图和导航控制器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

            }
        }

}

您还可以使用此实现定义带有导航图的目标。如果您需要添加或自定义bottomNaivationView项目徽章,您可以使用以下示例fun:

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
        
    }

相关问题