Единичные тесты NPE, когда я добавляю пользовательские переходы фрагментов
OnBackPressed() проверяет NPE, когда я добавил пользовательские переходы. Это нормально без пользовательских переходов. Почему?
ЭТО ТОЛЬКО ТОЛЬКО NPE ПРОИСХОДИТ В UNIT TEST, а не APP.
class MyActivity {
@Override
public void onBackPressed() {
.......
super.onBackPressed();
}
private void putFragment(Fragment fragment) {
String tag = fragment.getClass().getName();
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
// TEST FAILED IF I ADD THE FOLLOWING LINE
transaction.setCustomAnimations(
R.anim.slide_in_left_fade_in,
R.anim.fade_out_short_anim_time,
R.anim.fade_in_short_anim_time,
R.anim.slide_out_right_fade_out);
transaction.replace(R.id.ub__add_profiles_content, fragment, tag);
transaction.addToBackStack(tag);
transaction.commit();
}
}
class MyActivityTest extends RiderRobolectricBase {
@Test
public void onBackPressed() {
putFragment(someFragment);
mMyActivity.onBackPressed();
}
}
Исключение:
java.lang.NullPointerException
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1304)
at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:909)
at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1625)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:561)
at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:166)
at MyActivity.onBackPressed(MyActivity.java:28)
Ответы
Ответ 1
В режиме onbackpress вы отменяете предыдущие шаги изнутри backstack. Первое -
удалить существующий фрагмент. Фрагмент отделен от активности и
вы не сохраняете экземпляр этого фрагмента.
java.lang.NullPointerException
at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126)
at android.support.v4.app.FragmentManagerImpl.removeFragment(FragmentManager.java:1304)
at android.support.v4.app.BackStackRecord.popFromBackStack(BackStackRecord.java:909)
at android.support.v4.app.FragmentManagerImpl.popBackStackState(FragmentManager.java:1625)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:561)
at android.support.v4.app.FragmentActivity.onBackPressed(FragmentActivity.java:166)
at MyActivity.onBackPressed(MyActivity.java:28)
Вы звоните putFragment(someFragment)
.
Поэтому, когда вы идете на вызов setCustomAnimations. Предыдущее представление не сохраняется для использования в процессе перехода.
// TEST FAILED IF I ADD THE FOLLOWING LINE
transaction.setCustomAnimations(
R.anim.slide_in_left_fade_in,
R.anim.fade_out_short_anim_time,
R.anim.fade_in_short_anim_time,
R.anim.slide_out_right_fade_out);
Вы можете сохранить экземпляр в методе oncreate вашего фрагмента:
setRetainInstance(true);
Что касается этой работы в вашем приложении, я не вижу код внутри вашего события onBackPressed вашей деятельности.
Ответ 2
Код кажется правильным. Я подозреваю, что вы не можете вызвать addToBackStack()
после использования replace()
из-за вызова setCustomAnimations
. Поэтому для быстрого теста просто удалите вызов addToBackStack
.
Обычно вы можете вызвать addToBackStack() после replace(). Я делаю это много раз.
Сообщите мне о ваших результатах...