При изменении языка системы активность уничтожается и создается. Но для обеих страниц создается только 1 фрагмент. Из-за этого на обеих страницах видны одни и те же виджеты.
Когда основное действие воссоздается из-за изменения конфигурации, createFragment не вызывается из FragmentStateAdapter. Чтобы решить эту проблему, я добавил setSaveFromParentEnabled(false). При этом createFragment вызывается при каждом переходе. Он также вызывается, когда пользователь переключается на другой фрагмент с помощью компонента навигации и возвращается на главный экран. Итак, задержка наблюдается. Воссоздание фрагмента следует выполнять только при воссоздании активности.
Пожалуйста, помогите решить эту проблему. Заранее спасибо.
Код: Выделить всё
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;
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... -recreated
Мобильная версия