【问题标题】:Android bottom navigation fragments issueAndroid底部导航片段问题
【发布时间】:2018-03-10 13:39:07
【问题描述】:

我在我的活动中使用带有片段的底部导航。每个导航项都有四个片段。一切正常,除了一瞬间。在onCreate 中,我使用此代码在创建活动时加载第一个片段:

   //Manually displaying the first fragment - one time only

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
            transaction.replace(R.id.frame_layout, MyCoursesFragment.newInstance("",""));
            transaction.commit();

而我的 BottomNavigationListener 是:

 private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
        = new BottomNavigationView.OnNavigationItemSelectedListener() {

    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        Fragment selectedFragment = null;
        switch (item.getItemId()) {
            case R.id.navigation_home:
                selectedFragment = MyCoursesFragment.newInstance("","");
                break;
            case R.id.navigation_dashboard:
                selectedFragment = CatalogFragment.newInstance("","");
                break;
            case R.id.navigation_notifications:
                selectedFragment = MessagesFragment.newInstance("","");
                break;
            case R.id.my_people:
                selectedFragment = MyPeopleFragment.newInstance("","");
                break;
        }
        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.frame_layout, selectedFragment);
        transaction.commit();
        return true;
    }

};

所以,当我旋转手机并且屏幕方向改变时,我总是得到第一个片段(因为 onCreate 的第一段代码)。

没有它,我会在旋转后得到正确的片段,但第一次打开屏幕会是空的。

如何在旋转后获取正确的片段并在活动开始时加载第一个片段?

【问题讨论】:

    标签: android android-fragments fragment


    【解决方案1】:
    Activity is recreated after each rotation by default.
    

    您可以使用 configChanges 属性覆盖此行为 AndroidManifest 中的活动标签。

    android:configChanges="orientation|screenSize"
    

    Handling Configuration Changes

    【讨论】:

      【解决方案2】:

      上述解决方案对我不起作用。
      对我有用的是在加载默认片段之前检查 savedInstanceState 是否为空。 这确保了即使在旋转时,如果 savedInstanceState

      中存在属于另一个片段的数据,默认情况下也不会显示默认片段

      if(savedInstanceState==null) {
         //This is the function you call onCreate to load default fragment
         loadFragments(new MyDefaultFragment());
      }
      

      【讨论】:

        【解决方案3】:

        只需检查 bundle(OnsavedInstanceSate) 是否为空,然后显示默认片段

        【讨论】:

          猜你喜欢
          • 2020-03-23
          • 1970-01-01
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          • 2020-11-08
          • 1970-01-01
          • 2019-06-27
          • 1970-01-01
          相关资源
          最近更新 更多