11

カスタムトランジションを追加したときにOnBackPressed()テストでNPEがスローされます。カスタムトランジションなしでも問題ありません。どうして?ユニットのテストでは、フラグメントのカスタムトランジションを追加するとき

このNPEは単体テストにのみ存在し、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) 
+0

あなたのMyActivityはどのようなコードですか? –

+0

fade_in_short_anim_timeとslide_out_right_fade_outのレイアウトを、少なくともそれらのxmlに投稿してください。 –

答えて

1

あなたはbackstack内から前述の手順を逆にしているOnbackpress。最初に、 に既存のフラグメントを削除します。フラグメントはアクティビティから切り離され、
このフラグメントのインスタンスは保持されません。

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を呼び出す場合は、前のビューは保存されず、トランジションで使用されます。あなたのフラグメントのあなたのOnCreateメソッドでインスタンスを保持することができます

// 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); 

:あなたのアプリでこの作業については

setRetainInstance(true); 

、私はあなたの活動のあなたのonBackPressedイベント内のコードを参照することはできません。

0

コードが正しいようです。私はあなたがsetCustomAnimations呼び出しのためにreplace()を使用した後にaddToBackStack()と呼ぶことができないと思う。したがって、簡単なテストを行うには、addToBackStackへの呼び出しを削除するだけです。

通常、replace()の後にaddToBackStack()を呼び出すことができます。私は何度もそれをやる。

あなたの結果を教えてください...

関連する問題