在使用Android Navigation组件和BottomNavigationView时,默认情况下,每次切换底部导航项时,Fragment都会被重新创建。这可能会导致性能问题和不必要的资源消耗。为了防止这种情况,可以使用以下几种方法来保持Fragment的状态,而不是每次都重新创建它们。
FragmentTransaction
的show
和hide
方法你可以手动管理Fragment的显示和隐藏,而不是每次都替换它们。以下是一个示例:
public class MainActivity extends AppCompatActivity {
private FragmentManager fragmentManager;
private Fragment homeFragment;
private Fragment dashboardFragment;
private Fragment notificationsFragment;
private Fragment activeFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragmentManager = getSupportFragmentManager();
homeFragment = new HomeFragment();
dashboardFragment = new DashboardFragment();
notificationsFragment = new NotificationsFragment();
activeFragment = homeFragment;
fragmentManager.beginTransaction().add(R.id.fragment_container, homeFragment, "home").commit();
fragmentManager.beginTransaction().add(R.id.fragment_container, dashboardFragment, "dashboard").hide(dashboardFragment).commit();
fragmentManager.beginTransaction().add(R.id.fragment_container, notificationsFragment, "notifications").hide(notificationsFragment).commit();
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
bottomNavigationView.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.navigation_home:
switchFragment(homeFragment);
return true;
case R.id.navigation_dashboard:
switchFragment(dashboardFragment);
return true;
case R.id.navigation_notifications:
switchFragment(notificationsFragment);
return true;
}
return false;
}
});
}
private void switchFragment(Fragment fragment) {
fragmentManager.beginTransaction().hide(activeFragment).show(fragment).commit();
activeFragment = fragment;
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<com.google.android.material.bottomnavigation.BottomNavigationView
android:id="@+id/bottom_navigation"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
app:menu="@menu/bottom_nav_menu" />
</RelativeLayout>
NavController
和NavHostFragment
如果你想继续使用Navigation组件的NavController
和NavHostFragment
,你可以通过在NavHostFragment
中设置saveState
来保持Fragment的状态。
nav_graph.xml
中设置launchSingleTop
和restoreState
:<fragment
android:id="@+id/homeFragment"
android:name="com.example.app.HomeFragment"
android:label="Home"
tools:layout="@layout/fragment_home">
<action
android:id="@+id/action_homeFragment_to_dashboardFragment"
app:destination="@id/dashboardFragment"
app:launchSingleTop="true"
app:popUpTo="@id/homeFragment"
app:popUpToInclusive="true"
app:restoreState="true" />
</fragment>
NavController
:public class MainActivity extends AppCompatActivity {
private NavController navController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
BottomNavigationView bottomNavigationView = findViewById(R.id.bottom_navigation);
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
navController = navHostFragment.getNavController();
NavigationUI.setupWithNavController(bottomNavigationView, navController);
}
领取专属 10元无门槛券
手把手带您无忧上云