如何从“recyclerView”适配器以编程方式 select 底部导航菜单?

How to select a bottom navigation menu programmatically from a `recyclerView` adapter?

我在 'activity-home.xml' 中有 BottomNavigationView 如下。

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <com.google.android.material.bottomappbar.BottomAppBar
            android:id="@+id/bottom_appbar"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            app:fabCradleRoundedCornerRadius="50dp"
            app:fabCradleMargin="10dp">


    <com.google.android.material.bottomnavigation.BottomNavigationView
                    android:id="@+id/nav_view"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:layout_marginEnd="16dp"
                    android:background="@android:color/transparent"
                    app:menu="@menu/bottom_nav_menu"
                    app:itemIconTint="@color/bottom_nav_color"
                    app:itemTextColor="@color/bottom_nav_color"/>
        
            </com.google.android.material.bottomappbar.BottomAppBar>

<com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/fab_new"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:srcCompat="@drawable/fab_image"
            android:scaleType="center"
            app:maxImageSize="56dp"
            app:tint="@null"
            app:layout_anchor="@id/bottom_appbar"
            android:contentDescription="Show Categories" />
        
        <fragment
            android:id="@+id/nav_host_fragment"
          android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="50dp"
            app:defaultNavHost="true"
            app:layout_anchor="@id/bottom_appbar"
            app:navGraph="@navigation/mobile_navigation" />
        
    </androidx.coordinatorlayout.widget.CoordinatorLayout>

以下是'mobile_navigation.xml'

<?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/mobile_navigation"
    app:startDestination="@+id/nav_home">

    <fragment
        android:id="@+id/nav_home"
        android:name="com.abc.xyz.ui.fragments.HomeFragment"
        android:label="@string/mobile_navigation_label"
        tools:layout="@layout/fragment_home" />

    <fragment
        android:id="@+id/nav_orders"
        android:name="com.abc.xyz.ui.fragments.OrdersFragment"
        android:label="@string/mobile_navigation_label"
        tools:layout="@layout/fragment_orders"/>

    <fragment
        android:id="@+id/nav_cart"
        android:name="com.abc.xyz.ui.fragments.CartFragment"
        android:label="@string/mobile_navigation_label"
        tools:layout="@layout/fragment_cart"/>

</navigation>

当我单击底部导航中的每个菜单项时,它会显示相应的片段,并且一切都按预期完美运行。现在我想 show/open 'CartFragment.kt', ('R.id.nav_cart') 当我点击 'fragment_home' 的 recyclerView 中的按钮时。我尝试了以下方法,但它没有像我预期的那样工作。

以下是我在'fragment_home'

的适配器class中的onBindViewHolder
        holder.binding.btnGoToCart.setOnClickListener {
    val activity=context as HomeActivity
activity.supportFragmentManager.beginTransaction().replace(R.id.container,CartFragment()).addToBackStack(null).commit()
    }

尽管我按照上面的方法尝试过,但我认为这不是我应该做的。我只想导航到底部菜单 'R.id.nav_cart' 应该显示 'CartFragment'

编辑:

我还在 'fragment_home' 的适配器 class 中尝试了以下代码。当我按下按钮时,底部菜单会突出显示,就像它被选中一样,但我不知道真正发生了什么,因为它的片段没有正确显示。我的意思是,片段中有一个 recyclerView 和一些 textViewEditTexts,但未显示 recyclerView,仅显示其他视图。此外,当我点击其他底部菜单项时,除了突出显示这些菜单项外,什么也没有发生。

            holder.binding.btnGoToCart.setOnClickListener {

                val activity=context as MainActivity

                var fragment:Fragment=CartFragment()
                val bottomNav: BottomNavigationView = context.findViewById(R.id.nav_view)
                bottomNav.setOnNavigationItemSelectedListener { item ->
                    when (item.itemId) {
                        R.id.nav_cart -> {
                            fragment = CartFragment()
                        }
                    }
                    context.supportFragmentManager
                        .beginTransaction()
                        .replace(R.id.container, fragment)
                        .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)
                        .commit()
                    true
                }
                bottomNav.selectedItemId = R.id.nav_cart
            }

I should change my question to "How to select a bottom navigation menu programmatically from the recyclerView adapter?"

由于您使用的是导航库,因此您将以编程方式导航到所需的目的地。参见 the example in the documentation

在你的情况下,类似于:

holder.binding.btnGoToCart.setOnClickListener { view ->
    view.findNavController().navigate(R.id.nav_cart)
}