我爲Activity實例化了Android JUnit測試(實際上是tabs)。在測試期間,當我嘗試對這些選項卡執行任何操作時,它們會因爲getActivity()方法返回null而崩潰。實際應用程序(不是測試)從不顯示此行爲,並且片段getActivity()始終返回正確的父活動。我的測試情況是這樣的:片段getActivity()在Activity JUnit測試中返回null
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();
}
}
的AllTabs創建一個片段,然後要求,以這樣的方式
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();
....
在這裏,所有的片段最初是被後來的實際片段替換佔位符:
<FrameLayout
android:id="@+id/setup_tab"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
logcat顯示新的片段已被實例化。在相同的佈局,還有那似乎沒有這個問題前面提到的AllTabs片段(其中,以及它是如何得到FragmentManager否則):
<TabWidget
android:id="@android:id/alltabs"
...
最令人印象深刻,當我在片段經理獲得呼叫直接連接正確的活動,這仍然沒有效果。我試圖延遲五秒(我讀過transaction may be delayed),我嘗試通過runOnUiThread調用剩下的測試 - 沒有任何幫助。
問題是需要這樣做,以便在測試過程中將我的片段附加到活動。我有碎片,我有活動,我不能把一個附加到另一個。