如何从“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
和一些 textView
和 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
}
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)
}
我在 '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
和一些 textView
和 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
}
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)
}