首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用安卓导航组件时,有没有办法防止在bottomNavigation中重新创建碎片

在使用Android Navigation组件和BottomNavigationView时,默认情况下,每次切换底部导航项时,Fragment都会被重新创建。这可能会导致性能问题和不必要的资源消耗。为了防止这种情况,可以使用以下几种方法来保持Fragment的状态,而不是每次都重新创建它们。

方法1:使用FragmentTransactionshowhide方法

你可以手动管理Fragment的显示和隐藏,而不是每次都替换它们。以下是一个示例:

  1. 在Activity中初始化Fragment
代码语言:javascript
复制
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;
    }
}
  1. 在布局文件中定义Fragment容器和BottomNavigationView
代码语言:javascript
复制
<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>

方法2:使用NavControllerNavHostFragment

如果你想继续使用Navigation组件的NavControllerNavHostFragment,你可以通过在NavHostFragment中设置saveState来保持Fragment的状态。

  1. nav_graph.xml中设置launchSingleToprestoreState
代码语言:javascript
复制
<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>
  1. 在Activity中设置NavController
代码语言:javascript
复制
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);
    }
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的合辑

领券