11

ऑनबैकप्रेस() परीक्षण एनपीई फेंकता है जब मैंने कस्टम संक्रमण जोड़ा। कस्टम संक्रमण के बिना यह ठीक है। क्यूं कर?यूनिट परीक्षण एनपीई, जब मैं खंड कस्टम संक्रमण जोड़ता हूं

यह एनपीई केवल यूनिट परीक्षण में होता है, न कि एपीपी।

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

कृपया कम से कम उन xml fade_in_short_anim_time और slide_out_right_fade_out के लिए लेआउट पोस्ट करें। –

उत्तर

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

कोड सही लगता है। मुझे संदेह है कि setCustomAnimations कॉल के कारण replace() का उपयोग करने के बाद आप addToBackStack() पर कॉल नहीं कर सकते। तो त्वरित परीक्षण के लिए, बस addToBackStack पर कॉल को हटा दें।

आम तौर पर आप() के बाद addToBackStack() को कॉल कर सकते हैं। मैं इसे कई बार करता हूं।

मुझे अपने परिणामों के बारे में बताएं ...

संबंधित मुद्दे