CreateFragment не вызывается в FragmentStateAdapter, когда действие воссоздается из-за изменения конфигурации.Android

Форум для тех, кто программирует под Android
Ответить
Anonymous
 CreateFragment не вызывается в FragmentStateAdapter, когда действие воссоздается из-за изменения конфигурации.

Сообщение Anonymous »

На главном экране есть основное действие, а здесь есть основной фрагмент. Основной фрагмент использует viewPager2 для отображения экранов виджетов. Для 2 страниц создается 2 экземпляра фрагментов виджета.
При изменении языка системы активность уничтожается и создается. Но для обеих страниц создается только 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»