1

У меня есть активность, в которой размещаются два фрагмента с одним показанным одновременно. Эффективно пользователь, используя различные условия окружающей среды, должен иметь возможность переключаться между ними в любой момент времени.Ошибка анимации фрагмента фрагмента фрагмента Android после изменения ориентации

Существует в LoginFragment, который является первым, что видит пользователь при входе в систему, и LockoutFragment, который может заменить LoginFragment после входа пользователя в и мы видим их учетная запись заблокирована (естественно).

Это типичный случай, но есть случай, в котором LockoutFragment представлен первым, если, скажем, пользователь использует приложение, и их учетная запись заблокирована по какой-либо причине, и мы вновь открываем хост-активность (LoginActivity), показывая LockoutFragment, но давая им кнопку «Return to login», которая переключает внешний вид LoginFragment (также естественно).

Таким образом, моя цель - разрешить пользователю переключаться между двумя фрагментами, в зависимости от того, что отображается первым. Мой хозяин деятельности использует следующие функции для достижения этого эффекта:

private void showLockoutFragment() { 
    if (mLockoutFragment == null) { 
     mLockoutFragment = new LockoutFragment(); 
    } 

    transitionToFragment(FRAGMENT_LOCKOUT, mLockoutFragment); 
} 

private void showLoginFragment() { 
    if (mLoginFragment == null) { 
     mLoginFragment = new LoginFragment(); 
    } 

    transitionToFragment(FRAGMENT_LOGIN, mLoginFragment); 
} 

private void transitionToFragment(String transactionTag, Fragment fragment) { 
    if (!getFragmentManager().popBackStackImmediate(transactionTag, 0)) { 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 
     ft.setCustomAnimations(
       R.animator.fade_in, R.animator.fade_out, 
       R.animator.fade_in, R.animator.fade_out); 
     ft.addToBackStack(transactionTag); 
     ft.replace(R.id.fragment_container, fragment, transactionTag); 
     ft.commit(); 
    } 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    // non configuration change launch 
    if (savedInstanceState == null) { 
     Bundle extras = getIntent().getExtras(); 
     if (extras != null) { 
      // decide which fragment to show 
      boolean shouldLockout = extras.getBoolean(EXTRA_SHOULD_LOCKOUT); 
      if (shouldLockout) { 
       showLockoutFragment(); 
      } else { 
       showLoginFragment(); 
      } 
     } else { 
      showLoginFragment(); 
     } 
    } else { 
     // retrieve any pre-existing fragments 
     mLoginFragment = (LoginFragment)getFragmentManager().findFragmentByTag(FRAGMENT_LOGIN); 
     mLockoutFragment = (LockoutFragment)getFragmentManager().findFragmentByTag(FRAGMENT_LOCKOUT); 
    } 
} 

Эти функции работают вместе, как обаяние, за одним исключением: когда, после первого запуска приложения, пользователь войти

  1. попытки в,
  2. берется фрагмент локаута,
  3. переориентирует устройство и
  4. переходит обратно к авторизации фраг Мент,

фрагмент Логин теперь присутствует, но невидимая - как будто popEnter анимация никогда не играл. Я знаю, что он присутствует, потому что я все еще могу взаимодействовать с ним.

Также стоит отметить следующее:

  • У меня есть setRetainInstance(true) на как фрагменты
  • Это только происходит, когда пользователь переориентирует устройство из фрагмента локаута
  • Я попытался это как на симуляторе, так и на устройстве, использующем Lollipop с такими же результатами

Возможно ли, что задний стек поврежден после переориентации?

Спасибо!

ответ

0

Хорошо, поэтому проблема заключается в моем использовании setRetainInstance. В соответствии с документами для этого метода:

Контролировать, сохраняется ли экземпляр фрагмента во время повторного создания активности (например, при изменении конфигурации). Это может использовать только с фрагментами, не находящимися в задней стопке.[Курсив мой]

В то время как это кажется довольно загадочным для меня, кажется, что с помощью setRetainInstance(true) на фрагменте, который находится на задней стеке может просто иметь непредсказуемые последствия. В моем случае фрагмент, казалось, сохранился, но его анимация popEnter никогда не называлась (после вращения). Опять же, странно, но я думаю, просто избегаю этой комбинации.

Смежные вопросы