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

Posted

技术标签:

【中文标题】如何以编程方式从“recyclerView”适配器中选择底部导航菜单?【英文标题】:How to select a bottom navigation menu programmatically from a `recyclerView` adapter? 【发布时间】:2021-12-31 06:59:39 【问题描述】:

我在“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_
        android:layout_>
    
        <com.google.android.material.bottomappbar.BottomAppBar
            android:id="@+id/bottom_appbar"
            android:layout_
            android:layout_
            android:layout_gravity="bottom"
            app:fabCradleRoundedCornerRadius="50dp"
            app:fabCradleMargin="10dp">


    <com.google.android.material.bottomnavigation.BottomNavigationView
                    android:id="@+id/nav_view"
                    android:layout_
                    android:layout_
                    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_
            android:layout_
            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_
            android:layout_
            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>

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

以下是我在'fragment_home'的适配器类的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”的适配器类中尝试了以下代码。当我点击按钮时,底部菜单突出显示,好像它已被选中,但我不知道真正发生了什么,因为其中的片段没有正确显示。我的意思是,片段中有一个recyclerView 和几个textViews 和EditTexts,但没有显示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
            

【问题讨论】:

你能问得详细一点吗? CardFragment 是否显示在底部导航选项之一中,或者您想要导航底部导航未显示的全新 CardFragment? 我的问题已经更新了,请查收。 有人可以帮我解决这个问题吗? 你的问题有点不清楚(对我来说)。显示一些屏幕截图或视频以帮助说明问题。 developer.android.com/guide/navigation/navigation-global-action 【参考方案1】:

我应该将我的问题更改为“如何以编程方式从 recyclerView 适配器中选择底部导航菜单?”

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

在你的情况下,类似于:

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

【讨论】:

请看一下这个好吗? ***.com/q/70134116/13935956

以上是关于如何以编程方式从“recyclerView”适配器中选择底部导航菜单?的主要内容,如果未能解决你的问题,请参考以下文章

从 Viewholder 通知 RecyclerView 适配器的最佳方式?

以编程方式添加视图与使用 recyclerView 有啥区别?

从RecyclerView适配器更新活动或片段的视图

Recyclerview 以编程方式设置背景颜色

从 RecyclerView 中删除房间条目

如何以编程方式为工作灯适配器中的查询传递参数?