2012-07-18 108 views
12

我在活動上使用Action Bar。對於每個標籤,我都顯示不同的佈局。由於佈局太重。所以我將每個佈局充滿一個視圖。因此,在每個選項卡中選擇android get activity返回null

public void onTabSelected(Tab tab, FragmentTransaction ft) { 
    if (mView == null) { 
     mView = LayoutInflater.from(mAct).inflate(mLayout, null); // mAct is Activity reference 
    } 
    mAct.setContentView(mView); 
    for (int i = 0; i < mFrags.length; i++) { 
    mFrags[i] = (LutronFragment) mAct.getFragmentManager() 
     .findFragmentById(mIds[i]); 

    if (mFrags[i] != null) { 
     mFrags[i].setupHeader(); 
     } 
    } 
} 
public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
    for (Fragment f : mFrags) { 
    try { 
     if (f != null) { 
     ft.remove(f); 
     } 
    } catch (IllegalStateException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

所以現在,如果我選擇選項卡第二次做的是標籤一些操作,應用程序得到墜毀在getActivity。(空指針異常)

請建議,如果有一些其他的方法來緩存繁重的佈局。

+0

你是說'mAct'變爲空嗎? 此外,緩存佈局沒有意義,您應該做的是在後檯布局加載,而前臺應該有一些用戶界面,如進度對話框或某種中間用戶可以互動的屏幕。 最後,考慮減少佈局的權重,或按需加載元素。你可以發佈你的佈局xml,看它是否真的很重嗎? – gaara87 2012-07-18 07:31:09

回答

36

問題很可能是您正在使用與您的活動分離的舊片段。

因此,第一次創建Fragment時,它會附加到您的活動中。一切都很好。然後,當您更改標籤時,您的片段可能會或可能不會從活動中分離出來。當您回顧它時,舊片段可能與活動分離,因此getActivity()返回null。

如果您試圖保留對碎片的引用,而不是通過FragmentManager訪問它們,則可能會發生這種情況。

如果您的適配器正在返回對片段的引用而不是新片段,也會發生這種情況。我陷入了這個陷阱。

(發佈在其中創建您的碎片可能有助於代碼)

編輯

也許看看this以及他們如何創造增加他們的ActionBar聽衆。您需要範圍到您的活動。他們這樣做的方式是在Activity/Fragment中定義偵聽器(通過實現一個接口),然後將其附加到Tab中。這將給你的範圍,並可能是一個更穩定的做事方式。

+0

請編輯您的問題,並將其添加到底部。試圖閱讀這一點非​​常困難。 – 2012-07-18 07:35:15

+0

你從哪裏調用這段代碼?它看起來會從您的活動中調用。如果是這樣,爲什麼要在你的活動中引用你的活動?爲什麼不直接調用'setContentView(mView)'而不是'mAct.setContentView(mView)'? – 2012-07-18 07:38:24

+0

Plz查看編輯的問題 – 2012-07-18 07:40:08

5

如果您在調用getActiviy()的片段中創建匿名對象,就會發生這種情況。如果getActivity()在片段彈出片段堆棧後在匿名對象中調用,則getActivity()將返回空值。此時,片段不再與活動關聯。