У меня есть активность, в которой размещаются два фрагмента с одним показанным одновременно. Эффективно пользователь, используя различные условия окружающей среды, должен иметь возможность переключаться между ними в любой момент времени.Ошибка анимации фрагмента фрагмента фрагмента 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);
}
}
Эти функции работают вместе, как обаяние, за одним исключением: когда, после первого запуска приложения, пользователь войти
- попытки в,
- берется фрагмент локаута,
- переориентирует устройство и
- переходит обратно к авторизации фраг Мент,
фрагмент Логин теперь присутствует, но невидимая - как будто popEnter
анимация никогда не играл. Я знаю, что он присутствует, потому что я все еще могу взаимодействовать с ним.
Также стоит отметить следующее:
- У меня есть
setRetainInstance(true)
на как фрагменты - Это только происходит, когда пользователь переориентирует устройство из фрагмента локаута
- Я попытался это как на симуляторе, так и на устройстве, использующем Lollipop с такими же результатами
Возможно ли, что задний стек поврежден после переориентации?
Спасибо!