片段在导航抽屉/片段中的OnBackPress上重叠

时间:2020-05-07 09:21:13

标签: android android-fragments navigation-drawer android-fragmentactivity

我是Android的新手,并且使用片段。我正在使用带有片段的导航抽屉活动。所有代码工作正常。但是问题是当我导航到多个片段并从导航抽屉中打开片段,然后按返回按钮时,片段彼此重叠。当我一一打开它们时,所有片段都会重复。 我正在使用以下代码进行导航: 这是我的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();
        }
    });

Example Screenshot

2 个答案:

答案 0 :(得分:0)

我认为您必须在xml布局中分片使用白色背景,还必须使用android:clickable =“ true”和android:focusable =“ true”。尝试执行此操作,让我知道是否有任何问题。

答案 1 :(得分:0)

仅当我从“导航”抽屉导航到不同的片段时,才会发生问题。我找到了解决方案,并将此代码添加到我的 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);
                }
            }
        }
    });