11

OnBackPressed() test бросает NPE, когда я добавил пользовательских переходов. Это нормально без пользовательских переходов. Зачем?Единичные тесты NPE, когда я добавляю фрагменты пользовательских переходов

ЭТО ТОЛЬКО ТОЛЬКО ДЛЯ НЕДОСТАТОЧНОСТИ В ТЕСТЕ УСТРОЙСТВА, НЕ ПРИЛОЖЕНИЙ.

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) 
+0

Какой код находится в вашем onbackpressed MyActivity? –

+0

Пожалуйста, разместите макет для fade_in_short_anim_time и slide_out_right_fade_out, по крайней мере, этих xml. –

ответ

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 случае вашей деятельности.

0

Код кажется правильным. Я подозреваю, что вы не можете позвонить addToBackStack() после использования replace() из-за звонка setCustomAnimations. Поэтому для быстрого теста просто удалите вызов addToBackStack.

Обычно вы можете вызвать addToBackStack() после замены(). Я делаю это много раз.

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