片段在导航中的 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);
}
}
}
});
我是 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);
}
}
}
});