【问题标题】:BottomNavigationView not selecting item on fragment backstackBottomNavigationView 未选择片段后台堆栈上的项目
【发布时间】:2021-02-14 23:01:36
【问题描述】:

我有一个小应用程序,里面有活动和两个片段。片段与 BottomNavitationView 一起加载。

MonitoringFragment 在 Activity 的 OnCreate 上加载。

我想将这个添加到后台堆栈中,所以当我在第二个片段(ConnectionFragment)中并且我按下返回时,我会到达第一个片段。这工作正常。但是 BotttonNavigationView 没有得到更新(从第二个片段返回时没有将第一个项目设置为选中。图 3)。我认为它自己不能处理这种行为,我必须自己实现它,但我所做的每一次尝试都没有成功。

活动代码:

Fragment activeFragment = null;
BottomNavigationView bottomNavigationView = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    bottomNavigationView = findViewById(R.id.bottom_navigation);

    bottomNavigationView.setOnNavigationItemSelectedListener(item -> {
        switch (item.getItemId()) {
            case R.id.monitoring:
                setCurrentFragment(new MonitoringFragment(), false);
                break;
            case R.id.connection:
                setCurrentFragment(new ConnectionFragment(), true);
                break;
        }
        return true;
    });
    setCurrentFragment(new MonitoringFragment(), true);
}

private void setCurrentFragment(Fragment fragment, boolean addToBackStack) {
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    fragmentTransaction.replace(R.id.fragment_container, fragment);
    if (addToBackStack) {
        fragmentTransaction.addToBackStack(null);
    }
    fragmentTransaction.commit();
    activeFragment = fragment;
}

谢谢!

【问题讨论】:

    标签: android android-fragments fragment bottomnavigationview


    【解决方案1】:

    是的,BottomNavigationView 没有使用 fragmentManager 设置。当片段恢复时,您可以自己设置道具选择选项卡。

    或者您可以将导航组件与 BottomNavigationView 一起使用,它们可以正常工作。

    使用第二种方法时,按下返回按钮不会将您从第二个片段返回到第一个片段。

    【讨论】:

      【解决方案2】:

      遇到了类似的问题,我是这样解决的

      我将 OnDestinationChangedListener 添加到我的导航控制器中,并在我的项目中创建了几个带有片段目标标签的数组列表。

      当当前目的地在这些片段之一中时,底部菜单按钮被选中

      我希望代码示例比我的解释更清楚)

       val destListNews = arrayListOf(
              "news_fragment",
              "NewsViewingFragment"
          )
      
          val destListAds = arrayListOf(
              "ads_view_fragment",
              "ads_fragment",
              "AdsAddFragment"
          )
      
          val destListPass = arrayListOf(
              "pass_fragment",
              "pass_creation_fragment",
              "PassViewFragment"
          )
      
          val destListVotes = arrayListOf(
              "VotesListFragment",
              "VotesAddFragment",
              "ChooseVoteTypeFragment"
          )
      
          navController.addOnDestinationChangedListener { controller, destination, arguments ->
      
              when (destination.label) {
      
                  in destListNews -> {
                      bottom_nav.menu.getItem(0).isChecked = true
                  }
      
                  in destListAds -> {
                      bottom_nav.menu.getItem(1).isChecked = true
                  }
      
                  in destListPass -> {
                      bottom_nav.menu.getItem(2).isChecked = true
                  }
      
                  in destListVotes -> {
                      bottom_nav.menu.getItem(3).isChecked = true
                  }
      
                  else -> {
                      bottom_nav.menu.getItem(4).isChecked = true
                  }
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-24
        • 2022-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多