【问题标题】:Fragments overlap on OnBackPress in Navigation Drawer/Fragment导航抽屉/片段中的 OnBackPress 上的片段重叠
【发布时间】:2020-08-22 12:54:44
【问题描述】:
我是 Android 新手,我使用 Fragment。我正在使用带有片段的导航抽屉活动。所有代码工作正常。但问题是当我导航到多个片段并从导航抽屉打开片段并按下后退按钮时,片段彼此重叠。当我一一打开它们时,所有的片段都在重复。
我正在使用此代码进行导航:
这是我的 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();
}
});
【问题讨论】:
标签:
android
android-fragments
navigation-drawer
android-fragmentactivity
【解决方案1】:
只有当我从导航抽屉导航到不同的片段时才会出现问题。我找到了解决方案并将此代码添加到我的 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);
}
}
}
});
【解决方案2】:
我认为您必须在片段中为您的 xml 布局提供白色背景,并使用 android:clickable="true" 和 android:focusable="true"。试试这个,如果您有任何问题,请告诉我。