如何以编程方式从“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
和几个textView
s 和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 适配器的最佳方式?