Wenn die Systemsprache geändert wird, wird die Aktivität zerstört und erstellt. Für beide Seiten wird jedoch nur 1 Fragment erstellt. Aus diesem Grund werden auf beiden Seiten dieselben Widgets angezeigt.
Wenn die Hauptaktivität aufgrund einer Konfigurationsänderung neu erstellt wird, wird createFragment nicht von FragmentStateAdapter aufgerufen. Um dieses Problem zu lösen, habe ich setSaveFromParentEnabled(false) hinzugefügt. Damit wird createFragment in jedem Übergang aufgerufen. Es wird auch aufgerufen, wenn der Benutzer mithilfe der Navigationskomponente zu einem anderen Fragment wechselt und zum Homescreen zurückkehrt. Es ist also eine Verzögerung zu beobachten. Die Fragmentwiederherstellung sollte nur durchgeführt werden, wenn die Aktivität neu erstellt wird.
Bitte helfen Sie, dieses Problem zu lösen. Vielen Dank im Voraus.
Code: Select all
public class MainActivity{
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "onNewIntent: ");
handleScreenNavigation(intent);
}
public void handleScreenNavigation(Intent intent) {
int fragment = intent.getIntExtra(Constants.KEY_NAME, Constants.INVALID_FRAGMENT);
switch (fragment) {
default:
Log.d(TAG, "handleScreenNavigation: to the Home page");
NavHostFragment navHostFragment = (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
if (navHostFragment != null) {
navController = navHostFragment.getNavController();
NavDestination currentDestination = navController.getCurrentDestination();
Log.d(TAG, "handleScreenNavigation: currentDestination " + currentDestination);
if (currentDestination != null
&& currentDestination.getId() == R.id.launcherMainFragment) {
navController.popBackStack(R.id.launcherMainFragment, false);
if (navigationViewModel.getToFirstPage().getValue() != null
&& !navigationViewModel.getToFirstPage().getValue()) {
navigationViewModel.setToFirstPage(true);
}
} else {
Log.d(TAG, "handleScreenNavigation: navigate to main");
navController.popBackStack(navController.getGraph().getId(), true);
navController.navigate(R.id.launcherMainFragment);
}
}
break;
}
}
}
--------------------------------------------------------------------------------
public class MainFragment extends Fragment {
@Override
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
fragmentMainBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_main, container,
} else {
fragmentMainBinding.pager.setVisibility(View.VISIBLE);
fragmentMainBinding.leftFrame.setVisibility(View.VISIBLE);
fragmentMainBinding.rightFrame.setVisibility(View.VISIBLE);
fragmentMainBinding.singlePageContainer.setVisibility(View.GONE);
adapter = new LauncherPagerAdapter(getChildFragmentManager(), getViewLifecycleOwner().getLifecycle());
setCustomPageSnapperForHomeScreenAnimation();
fragmentMainBinding.pager.setAdapter(adapter);
//I used this, but it has caused the createFragment to be called on every transition
//fragmentMainBinding.pager.setSaveFromParentEnabled(false);
handlePageScroll();
}
return fragmentMainBinding.getRoot();
}
@Override
public void onDestroyView() {
if (adapter != null) {
adapter = null;
}
if (fragmentMainBinding != null) {
fragmentMainBinding.pager.unregisterOnPageChangeCallback(pageChangeCallback);
fragmentMainBinding.pager.removeAllViews();
fragmentMainBinding.layout.removeAllViews();
fragmentMainBinding = null;
}
super.onDestroyView();
}
--------------------------------------------------------------------------------
import androidx.viewpager2.adapter.FragmentStateAdapter;
public class PagerAdapter extends FragmentStateAdapter {
private final Fragment firstFragment;
private final Fragment secondFragment;
public LauncherPagerAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle
lifecycle) {
super(fragmentManager, lifecycle);
firstFragment = new WidgetFragment(LauncherConstants.HOMESCREEN_FIRST_PAGE);
secondFragment = new WidgetFragment(LauncherConstants.HOMESCREEN_SECOND_PAGE);
}
@NonNull
@Override
public Fragment createFragment(int position) {
if (position == LauncherConstants.HOMESCREEN_FIRST_PAGE) {
return firstFragment;
} else {
return secondFragment;
}
}
@Override
public int getItemCount() {
return LauncherConstants.MAX_PAGE_COUNT;
}