可以通过使用 Fragment 来解决 BottomNavigationView 不能保存 UI 状态的问题。具体实现方法如下:
1.创建三个 Fragment,并在 MainActivity 中添加 BottomNavigationView:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView navigation = (BottomNavigationView) findViewById(R.id.navigation);
navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.content, HomeFragment.newInstance()).commit();
}
private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
= new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
FragmentManager fm = getSupportFragmentManager();
fm.beginTransaction().replace(R.id.content, HomeFragment.newInstance()).commit();
return true;
case R.id.navigation_dashboard:
FragmentManager fm1 = getSupportFragmentManager();
fm1.beginTransaction().replace(R.id.content, DashboardFragment.newInstance()).commit();
return true;
case R.id.navigation_notifications:
FragmentManager fm2 = getSupportFragmentManager();
fm2.beginTransaction().replace(R.id.content, NotificationFragment.newInstance()).commit();
return true;
}
return false;
}
};
2.在各个 Fragment 中保存自己的 UI 状态:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("scroll_position", mRecyclerView.getScrollY());
}
@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
super.onViewStateRestored(savedInstanceState);
if (savedInstanceState != null) {
scrollToPosition(savedInstanceState.getInt("scroll_position"));
}
}
这样,每个 Fragment 在被销毁和重建时都可以保存自己的 UI 状态,从而实现 BottomNavigationView 保存 UI 状态的效果。