11

Thử nghiệm OnBackPressed() ném NPE khi tôi thêm chuyển đổi tùy chỉnh. Đó là tốt mà không có sự chuyển tiếp tùy chỉnh. Tại sao?Kiểm tra đơn vị NPE, khi tôi thêm chuyển tiếp tùy chỉnh phân đoạn

NÀY NÀY CHỈ PHÁT HIỆN TRONG KIỂM TRA ĐƠN VỊ, KHÔNG PHẢI ỨNG DỤNG.

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(); 
    } 
} 

Ngoại lệ:

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

Mã nào được đặt trong chế độ chờ của bạn của MyActivity? –

+0

Vui lòng đăng bố cục cho fade_in_short_anim_time và slide_out_right_fade_out, ít nhất là xml đó. –

Trả lời

1

Onbackpress bạn đang đảo ngược các bước trước đó từ bên trong backstack. Đầu tiên là để xóa đoạn hiện có. Đoạn được tách ra khỏi hoạt động và
bạn không giữ lại một bản sao của đoạn này.

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) 

Bạn gọi số putFragment(someFragment).
Vì vậy, khi bạn gọi đến setCustomAnimations. Chế độ xem trước đó không được lưu để sử dụng trong quá trình chuyển đổi.

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

Bạn có thể giữ lại các ví dụ trong phương pháp onCreate lại mảnh của bạn:

setRetainInstance(true); 

Đối với hoạt động này trong ứng dụng của bạn, tôi không thể nhìn thấy đoạn code trong sự kiện onBackPressed lại hoạt động của bạn.

0

Mã có vẻ chính xác. Tôi nghi ngờ bạn không thể gọi số addToBackStack() sau khi sử dụng replace() do cuộc gọi setCustomAnimations. Vì vậy, để kiểm tra nhanh, chỉ cần xóa cuộc gọi đến addToBackStack.

Thông thường bạn có thể gọi addToBackStack() sau khi thay thế(). Tôi làm điều đó nhiều lần.

Cho tôi biết kết quả của bạn ...

Các vấn đề liên quan