繁体   English   中英

Android底部导航碎片问题

[英]Android bottom navigation fragments issue

我在我的活动中使用带有片段的底部导航。 每个导航项都有四个片段。 一切正常,除了片刻。 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;
    }

};

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

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

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

Activity is recreated after each rotation by default.

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

android:configChanges="orientation|screenSize"

处理配置更改

上述解决方案对我不起作用。
对我有用的是在加载默认片段之前检查saveInstanceState是否为null。 这样可以确保即使在旋转时,如果saveInstanceState中存在属于另一个片段的数据,默认情况下也不会默认显示默认片段

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM