首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BottomNavigationView重装片段

BottomNavigationView重装片段
EN

Stack Overflow用户
提问于 2022-10-09 10:49:28
回答 1查看 63关注 0票数 1

我已经用BottomNavigationView实现了NavController,但是每次单击片段都会重新加载,即使使用了新的导航库更新。我也尝试过setOnNavigationItemReselectedListener,但是它不会触发任何东西。我做错什么了?我知道这个问题已经问过不止一次了,但我觉得我试过所有的问题,但没有一个有效。我希望我能避免用旧库恢复我的代码,或者使用样板解决方案。这是我的代码:

build.gradle (:app)

代码语言:javascript
复制
implementation 'androidx.navigation:navigation-runtime-ktx:2.5.2'
implementation 'androidx.navigation:navigation-fragment-ktx:2.5.2'
implementation 'androidx.navigation:navigation-ui-ktx:2.5.2'

HomeActivity.kt

代码语言:javascript
复制
class HomeActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener,
Serializable {
private lateinit var binding: ActivityHomeBinding
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding= ActivityHomeBinding.inflate(layoutInflater)
    setContentView(binding.root)
    val navHostFragment = supportFragmentManager.findFragmentById(R.id.home_container) as NavHostFragment
    navController = navHostFragment.navController
    binding.bottomNavigation.setupWithNavController(navController) 
    }
    }

activity_home.xml

代码语言:javascript
复制
    <RelativeLayout 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"
android:fitsSystemWindows="true"
tools:openDrawer="start"
    tools:context=".HomeActivity">

        <androidx.fragment.app.FragmentContainerView
            android:id="@+id/home_container"
            android:name="androidx.navigation.fragment.NavHostFragment"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            app:defaultNavHost="true"
            app:layout_constraintBottom_toTopOf="@+id/bottom_navigation"
            app:layout_constraintTop_toBottomOf="@+id/appbar_layout"
            app:navGraph="@navigation/nav_main" />

        <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottom_navigation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:menu="@menu/bottom_navigation_menu"
            app:layout_constraintTop_toBottomOf="@+id/home_container"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintHorizontal_bias="0.5"/>

</RelativeLayout>

nav_main.xml

代码语言:javascript
复制
<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/nav_main"
    app:startDestination="@id/firstFragment">

    <fragment
        android:id="@+id/firstFragment"
        android:name="com.projectName.ui.main.ContactsFragment"
        tools:layout="@layout/fragment_contacts" />
    <fragment
        android:id="@+id/secondFragment"
        android:name="com.projectName.SearchFragment"
        android:label="@string/search"
        tools:layout="@layout/search_fragment" />
    <fragment
        android:id="@+id/thirdFragment"
        android:name="com.projectName.ui.main.NotificationsFragment"
        tools:layout="@layout/notifications_fragment" />
    <fragment
        android:id="@+id/fourthFragment"
        android:name="com.projectName.chat.ChatFragment"
        tools:layout="@layout/fragment_main_page" />
</navigation>

bottom_navigation_menu.xml

代码语言:javascript
复制
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
        android:id="@+id/firstFragment"
        android:enabled="true"
        android:icon="@drawable/ic_baseline_contacts_24"
        android:title=""
        app:labelVisibilityMode="unlabeled"/>
    <item
        android:id="@+id/secondFragment"
        android:enabled="true"
        android:icon="@drawable/ic_search_white_24dp"
        android:title=""
        app:labelVisibilityMode="unlabeled"/>
    <item
        android:id="@+id/thirdFragment"
        android:enabled="true"
        android:icon="@drawable/ic_baseline_notifications_none_24"
        android:title=""
        app:labelVisibilityMode="unlabeled"/>
    <item
        android:id="@+id/fourthFragment"
        android:enabled="true"
        android:icon="@drawable/ic_message_white_24dp"
        android:title=""
        app:labelVisibilityMode="unlabeled"/>
</menu>

片段

代码语言:javascript
复制
class NotificationsFragment : Fragment() {
    companion object {
        fun newInstance() = NotificationsFragment()
    }
    private lateinit var viewModel: NotificationsViewModel
    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {

        viewModel = ViewModelProvider(this).get(NotificationsViewModel::class.java)
        return inflater.inflate(R.layout.notifications_fragment, container, false)
    }
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
}

我也给了每个布局一个ID,就像savedInstateState文档所建议的那样。

谢谢。

编辑

我无法找到解决问题的方法,所以我在ViewPager2中使用了ViewPager2:

HomePagerAdapter.kt

代码语言:javascript
复制
private val TAB_TITLES = arrayOf(
    Constants.CONTACTS,
    Constants.SEARCH,
    Constants.NOTIFICATIONS,
    Constants.CHATS
)

class HomePagerAdapter(fa: FragmentActivity) : FragmentStateAdapter(fa) {
    override fun getItemCount(): Int = TAB_TITLES.size

    override fun createFragment(position: Int): Fragment {
        return if (getPageTitle(position) == Constants.CONTACTS) {
            ContactsFragment.newInstance()
        } else if (getPageTitle(position) == Constants.SEARCH) {
            SearchFragment.newInstance()
        } else if (getPageTitle(position) == Constants.NOTIFICATIONS) {
            NotificationsFragment.newInstance()
        } else {
            ChatsFragment.newInstance()
        }
    }

    private fun getPageTitle(position: Int): String {
        return TAB_TITLES[position]
    }
}

HomeActivity.kt

代码语言:javascript
复制
class HomeActivity : BaseActivity(), NavigationView.OnNavigationItemSelectedListener,
    Serializable, SearchFragment.OnPersonSelectedListener {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_home)

    val homePagerAdapter = HomePagerAdapter(this)
    val viewPager: ViewPager2 = findViewById(R.id.home_view_pager)
    viewPager.adapter = homePagerAdapter
    viewPager.isUserInputEnabled = false
    viewPager.offscreenPageLimit = 1
    viewPager.overScrollMode = ViewPager2.OVER_SCROLL_NEVER

    findViewById<BottomNavigationView>(R.id.bottom_navigation)
        .setOnItemSelectedListener {
            when (it.itemId) {
                R.id.firstFragment -> {
                    viewPager.setCurrentItem(0, false)
                    return@setOnItemSelectedListener true
                }
                R.id.secondFragment -> {
                    viewPager.setCurrentItem(1, false)
                    return@setOnItemSelectedListener true
                }
                R.id.thirdFragment -> {
                    viewPager.setCurrentItem(2, false)
                    return@setOnItemSelectedListener true
                }
                R.id.fourthFragment -> {
                    viewPager.setCurrentItem(3, false)
                    return@setOnItemSelectedListener true
                }
                else -> return@setOnItemSelectedListener false
            }

            }
}
}

activity_home.xml

代码语言:javascript
复制
<androidx.viewpager2.widget.ViewPager2
    android:id="@+id/home_view_pager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
 app:layout_constraintBottom_toTopOf="@+id/bottom_navigation"
    app:layout_constraintTop_toBottomOf="@+id/appbar_layout"
 app:layout_behavior="@string/appbar_scrolling_view_behavior" />

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:id="@+id/bottom_navigation"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:menu="@menu/bottom_navigation_menu"
   app:layout_constraintTop_toBottomOf="@+id/home_view_pager"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintHorizontal_bias="0.5"/>
EN

回答 1

Stack Overflow用户

发布于 2022-10-09 11:40:40

如果我正确地理解了您的问题,那么每当您从一个片段更改到另一个片段时,您都希望通过使用底部导航栏将片段保持其状态。我认为这可能对https://developer.android.com/guide/navigation/multi-back-stacks有帮助。底部导航中的每个选项卡都有自己的图表,当从一个选项卡切换到另一个选项卡时,状态将被保存。如果这能帮到你就告诉我!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74004086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档