【问题标题】:BottomNavigationView with navgraph loading fragment again再次使用导航图加载片段的 BottomNavigationView
【发布时间】:2019-03-15 08:39:02
【问题描述】:

我正在使用 BottomNavigationViewnav-graph 下面是我的代码

MainActivity.class

navController = Navigation.findNavController(this, R.id.mainFragment);

    bottomNavigation.setOnNavigationItemSelectedListener(menuItem -> {
        switch (menuItem.getItemId()){
            case R.id.home:
                navController.navigate(R.id.exploreFragment);
                return true;
            case R.id.events:
                navController.navigate(R.id.eventsFragment);
                return true;
            case R.id.stories:
                navController.navigate(R.id.storiesFragment);
                return true;
        }
        return false;
    });

activity_main.xml

<fragment
    android:id="@+id/mainFragment"
    app:defaultNavHost="true"
    android:name="androidx.navigation.fragment.NavHostFragment"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintBottom_toTopOf="@+id/bottomNavigation"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:navGraph="@navigation/nav_home"/>

<com.google.android.material.bottomnavigation.BottomNavigationView
    android:layout_width="match_parent"
    app:itemIconTint="@drawable/bottom_navigation_color"
    app:itemTextColor="@drawable/bottom_navigation_color"
    android:background="@color/grey_50"
    android:id="@+id/bottomNavigation"
    app:menu="@menu/bottom_navigation"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    android:layout_height="wrap_content"/>

<include
    layout="@layout/toolbar"
    android:id="@+id/toolbar"/>

nav_home.xml

<fragment
    android:id="@+id/exploreFragment"
    android:name="com.decathlon.allforsport.home.explore.ExploreFragment"
    tools:layout="@layout/fragment_explore" />
<fragment
    android:id="@+id/eventsFragment"
    android:name="com.decathlon.allforsport.home.events.EventsFragment"
    tools:layout="@layout/fragment_stories" />
<fragment
    android:id="@+id/storiesFragment"
    android:name="com.decathlon.allforsport.home.stories.StoriesFragment"
    tools:layout="@layout/fragment_stories" />

所以问题是当我在底部导航视图中点击主页时,它会一次又一次地重新加载片段。我尝试了很多方法,但都没有成功。

【问题讨论】:

    标签: android kotlin bottomnavigationview androidx


    【解决方案1】:

    由于您使用的是navigation controller,您可以删除setOnNavigationItemSelectedListener函数。

    bottom_navigation 菜单中,确保您定义的项目ID 与您在nav graph 中定义的ID 相同。

    你需要这些代码来使底部导航栏正常工作

    setupActionBarWithNavController(navController!!)
    bottomNavigation.setupWithNavController(navController!!)
    

    编辑

    对于 androidx

    NavigationUI.setupWithNavController(bottomNavigation, 
    Navigation.findNavController(this, R.id.mainFragment))
    

    【讨论】:

    • @Rohit 使用android.support.design.widget.BottomNavigationView 而不是com.google.android.material.bottomnavigation.BottomNavigationView
    • 我正在使用andorid x。
    • 我用过方法 嗨,我试过NavigationUI.setupWithNavController(bottomNavigation, navController); 它给了我同样的结果。这类似于 kotlin 的 bottomNavigation.setupWithNavController(navController)。它再次调用片段的 onCreateView()
    • 不。 :( 仍在寻找解决方案。到目前为止,我已经获得了支持的文章和答案,但我的代码在 android x 中。com.google.android.material.bottomnavigation.BottomNavigationView 在 android x 中。
    【解决方案2】:
    val navController = Navigation.findNavController(this, R.id.mainFragment) 
    bottomNavigation.setOnNavigationItemSelectedListener {
                    if (it.itemId != bottomNavigation.selectedItemId)
                        NavigationUI.onNavDestinationSelected(it, navController)
                     true
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-27
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      • 2022-07-14
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      相关资源
      最近更新 更多