2013-01-11 38 views
5

Tôi đã viết kiểm tra JUnit của Android cho Activity mà instantiates fragments (thực ra là các tab). Trong quá trình thử nghiệm, khi tôi cố gắng làm bất cứ điều gì với các tab này, chúng bị lỗi bởi vì phương thức getActivity() trong chúng trả về null. Các ứng dụng thực tế (không phải là một thử nghiệm) không bao giờ cho thấy hành vi này và đoạn getActivity() luôn luôn trả về hoạt động chính xác của cha mẹ ở đó. trường hợp thử nghiệm của tôi trông giống như:Fragment getActivity() trả về null trong Activity JUnit test

public class SetupPanelTest extends ActivityUnitTestCase<MyAct> { 

    FSetup s; 

    public SetupPanelTest() { 
    super(MyAct.class); 
    } 

    protected void setUp() throws Exception { 
     super.setUp(); 
     startActivity(new Intent(), null, null); 
     final MyAct act = getActivity(); 

     AllTabs tabs = act.getTabs(); 
     String tabname = act.getResources().getString(R.string.configuration); 

     // This method instantiates the activity as said below 
     s = (FSetup) tabs.showTab(tabname); 
     FragmentManager m = act.getFragmentManager(); 
     // m.beginTransaction().attach(s).commit(); 
     //  ... and even this does not help when commented out 

     assertTrue(s instanceof FSetup); // Ok  
     assertEquals(act, s.getActivity()); // Failure 
    } 

    public void testOnPause() { 
     // this crashes because s.getActivity == null; 
     s.onPause(); 
     } 
} 

Các AllTabs tạo ra một đoạn, sau đó yêu cầu, theo cách này:

FragmentManager manager = getFragmentManager(); 
Fragment fragment = manager.findFragmentByTag(tabname); 
if (fragment == null || fragment.getActivity() == null) { 
     Log.v(TAG, "Instantiating "); 
     fragment = new MyFragment(); 
     manager.beginTransaction().replace(R.id.setup_tab, fragment, tabname).commit(); 
.... 

Ở đây, tất cả các mảnh vỡ là bước đầu placeholders mà sau này được thay thế bằng các mảnh vỡ thực tế:

<FrameLayout 
    android:id="@+id/setup_tab" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" />  

Logcat cho thấy rằng đoạn mới đã được khởi tạo. Trong cách bố trí giống nhau, đó cũng là AllTabs đoạn đã đề cập trước đó dường như không có vấn đề này (ở đâu và làm thế nào nó được FragmentManager khác):

<TabWidget 
    android:id="@android:id/alltabs" 
... 

ấn tượng nhất, khi tôi gọi gắn trực tiếp trên người quản lý đoạn thu được trên hoạt động đúng, điều này vẫn không có hiệu lực. Tôi đã cố gắng để đặt năm giây chậm trễ (tôi đã đọc rằng transaction may be delayed), tôi đã cố gắng để gọi phần còn lại của thử nghiệm thông qua runOnUiThread - không có gì giúp.

Câu hỏi là cần phải làm như vậy để đính kèm đoạn của tôi vào hoạt động cũng trong khi thử nghiệm. Tôi có mảnh vỡ và tôi có hoạt động, tôi không thể gắn bó với nhau.

Trả lời

9

Ngay cả khi bạn gọi .commit() về giao dịch, nó vẫn chưa được thực hiện, các đoạn chỉ được đính kèm một cách lười biếng.

FragmentManager m = activity.getFragmentManager(); 
    m.executePendingTransactions(); 

Điều này cuối cùng gắn tất cả các đoạn vào hoạt động. Dường như dự phòng khi chạy ứng dụng nhưng yêu cầu trong trường hợp kiểm tra JUnit.

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