11

OnBackPressed()當我添加自定義轉換時,測試會拋出NPE。沒有自定義轉換就沒問題。爲什麼?當我添加片段自定義轉換時,單元測試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

你的onbackpressed的MyActivity的代碼是什麼? –

+0

請發佈fade_in_short_anim_time和slide_out_right_fade_out的佈局,至少是那些xml。 –

回答

1

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。以前的視圖不保存在轉換中使用。

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

該代碼似乎是正確的。我懷疑你使用replace()後致電addToBackStack(),因撥打setCustomAnimations。因此,要進行快速測試,只需撥打addToBackStack即可。

通常,您可以在replace()後調用addToBackStack()。我做了很多次。

讓我知道你的結果...

相關問題