片段在导航中的 OnBackPress 上重叠 Drawer/Fragment

Fragments overlap on OnBackPress in Navigation Drawer/Fragment

我是 Android 的新人,我使用片段。我正在使用 Navigation Drawer Activity 和片段。所有代码都工作正常。但问题是当我导航到多个片段并从导航抽屉中打开片段,然后按下后退按钮时,片段相互重叠。当我一个一个地打开它们时,所有的片段都会重复。 我正在使用此代码进行导航: 这是我的 HomeFragment 代码

requests.setOnClickListener(new View.OnClickListener() {
             @Override
            public void onClick(View v) {
            ConrequestsFragment fragment = new ConrequestsFragment();
            FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
            fragmentTransaction.replace(R.id.nav_host_fragment, fragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }
    });

我认为您必须在片段中为 xml 布局提供白色背景,并使用 android:clickable="true" & android:focusable="true"。试试这个,如果您有任何问题,请告诉我。

只有当我从导航抽屉导航到不同的片段时才会出现问题。我找到了解决方案并将此代码添加到我的 MainActivity.java 这是代码:

    DrawerLayout drawer = findViewById(R.id.drawer_layout);
    NavigationView navigationView = findViewById(R.id.nav_view);
    mAppBarConfiguration = new AppBarConfiguration.Builder(
            R.id.nav_home,R.id.nav_profile, R.id.nav_gallery, R.id.nav_status, R.id.nav_package,R.id.nav_contact)
            .setDrawerLayout(drawer)
            .build();
    NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
    NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
    NavigationUI.setupWithNavController(navigationView, navController);

    navController.addOnDestinationChangedListener(new NavController.OnDestinationChangedListener() {
        @Override
        public void onDestinationChanged(@NonNull NavController controller, @NonNull
                NavDestination destination, @Nullable Bundle arguments) {

            if (destination.getId() == R.id.nav_home) {
                int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
                for (int i = 0; i < backStackCount; i++) {
                    int backStackId = getSupportFragmentManager().getBackStackEntryAt(i).getId();
                    getSupportFragmentManager().popBackStack(backStackId,
                            FragmentManager.POP_BACK_STACK_INCLUSIVE);
                }
            }
            if (destination.getId() == R.id.nav_profile) {
                int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
                for (int i = 0; i < backStackCount; i++) {
                    int backStackId = getSupportFragmentManager().getBackStackEntryAt(i).getId();
                    getSupportFragmentManager().popBackStack(backStackId,
                            FragmentManager.POP_BACK_STACK_INCLUSIVE);
                }
            }
            if (destination.getId() == R.id.nav_gallery) {
                int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
                for (int i = 0; i < backStackCount; i++) {
                    int backStackId = getSupportFragmentManager().getBackStackEntryAt(i).getId();
                    getSupportFragmentManager().popBackStack(backStackId,
                            FragmentManager.POP_BACK_STACK_INCLUSIVE);
                }

            }
            if (destination.getId() == R.id.nav_status) {
                int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
                for (int i = 0; i < backStackCount; i++) {
                    int backStackId = getSupportFragmentManager().getBackStackEntryAt(i).getId();
                    getSupportFragmentManager().popBackStack(backStackId,
                            FragmentManager.POP_BACK_STACK_INCLUSIVE);
                }

            }
            if (destination.getId() == R.id.nav_package) {

                int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
                for (int i = 0; i < backStackCount; i++) {
                    int backStackId = getSupportFragmentManager().getBackStackEntryAt(i).getId();
                    getSupportFragmentManager().popBackStack(backStackId,
                            FragmentManager.POP_BACK_STACK_INCLUSIVE);
                }
            }
            if (destination.getId() == R.id.nav_contact) {

                int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
                for (int i = 0; i < backStackCount; i++) {
                    int backStackId = getSupportFragmentManager().getBackStackEntryAt(i).getId();
                    getSupportFragmentManager().popBackStack(backStackId,
                            FragmentManager.POP_BACK_STACK_INCLUSIVE);
                }
            }
        }
    });