Подтвердить что ты не робот

Единичные тесты 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)
4b9b3361

Ответ 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(). Я делаю это много раз.

Сообщите мне о ваших результатах...