Android底部导航片段问题
Posted
技术标签:
【中文标题】Android底部导航片段问题【英文标题】:Android bottom navigation fragments issue 【发布时间】: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 的第一段代码)。
没有它,我会在旋转后得到正确的片段,但第一次打开屏幕会是空的。
如何在旋转后获取正确的片段并在活动开始时加载第一个片段?
【问题讨论】:
【参考方案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) 是否为空,然后显示默认片段
【讨论】:
以上是关于Android底部导航片段问题的主要内容,如果未能解决你的问题,请参考以下文章
如何使用底部导航视图和 Android 导航组件将参数传递给片段?