2012-07-18 13 views
12

私はアクティビティでアクションバーを使用しています。各タブごとに異なるレイアウトを表示しています。レイアウトが重すぎるので。だから私はビューに各レイアウトを膨らませている。だから、それぞれのタブに今、私はタブ秒の時間を選択した場合android getアクティビティが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にクラッシュします。(NullPointerExceptionが)にはいくつかの別のアプローチがある場合

が提案して下さいキャッシュの重いレイアウト。

+0

あなたは 'mAct'がnullになると言っていますか? また、レイアウトのキャッシュには何の意味もありません。フォアグラウンドには進行状況ダイアログや中間ユーザー対話型画面のようなユーザーインターフェイスが必要ですが、バックグラウンドではレイアウトの読み込みが必要です。 最後に、レイアウトの重さを減らすか、必要に応じて要素を読み込むことを検討してください。レイアウトxmlを投稿して実際に重いかどうか確認できますか? – gaara87

答えて

36

問題は、あなたのアクティビティから切り離された古いフラグメントを使用している可能性が高いです。

フラグメントを初めて作成すると、そのフラグメントはアクティビティに添付されます。すべてが良いです。次に、タブを変更すると、フラグメントがアクティビティから切り離されることがあります。そのタブに戻ると、古いフラグメントがアクティビティから切り離され、getActivity()がnullを返します。

これは、FragmentManagerでアクセスするのではなく、あなたのフラグメントへの参照を保持しようとしている場合に発生します。

これは、アダプタが新しいフラグメントではなくフラグメントへの参照を返す場合にも発生します。私はこの罠に落ちた。

(あなたの断片を作成したコードを投稿することは役立つかもしれない)

編集

たぶんthisを見て、どのように彼らは彼らのアクションバーのリスナーを追加作成しています。アクティビティの範囲が必要です。彼らがやる方法は、(インターフェイスを実装することによって)アクティビティ/フラグメントにリスナを定義し、それをTabにアタッチすることです。これはあなたに範囲を与え、おそらくより安定した方法です。

+0

質問を編集して、下に追加してください。これを読もうとするのは本当に大変です。 –

+0

どこからこのコードを呼び出していますか?それはあなたの活動から呼び出されるようです。もしそうなら、あなたのアクティビティへのあなたのアクティビティへの参照を保持するのはなぜですか? 'mAct.setContentView(mView)'ではなく 'setContentView(mView)'を呼び出すだけでいいのですか? –

+0

Plz編集された質問を参照 –

5

これは、getActiviy()を呼び出すフラグメント内に匿名オブジェクトを作成した場合に発生します。フラグメントがフラグメントスタックからポップされた後に匿名オブジェクトでgetActivity()が呼び出された場合、getActivity()はnullを返します。その時点で、フラグメントはもはやアクティビティに関連付けられません。

関連する問題