14

アクティビティでアクションバーを使用しています。タブごとに異なるレイアウトを表示しています。レイアウトが重すぎるので。だから私は各レイアウトをビューに膨らませています。したがって、各タブで選択します

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

したがって、タブを2回選択してそのタブで何らかの操作を行うと、getActivityでアプリがクラッシュします。(NullPointerException)

重いレイアウトをキャッシュする別のアプローチがあるかどうかを提案してください。

4

2 に答える 2

39

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

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

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

また、アダプタが新しいフラグメントではなくフラグメントへの参照を返している場合にも発生する可能性があります。私はこの罠に陥った。

(フラグメントを作成する場所にコードを投稿すると役立つ場合があります)

編集

たぶん、これと、彼らがどのように作成するかを見て、ActionBarリスナーを追加してください。アクティビティの範囲が必要です。彼らがそれを行う方法は、(インターフェースの実装を介して)アクティビティ/フラグメントでリスナーを定義し、それをタブにアタッチすることです。これはあなたに範囲を与え、おそらく物事を行うためのより安定した方法です。

于 2012-07-18T07:29:05.197 に答える
6

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

于 2014-07-23T20:18:42.963 に答える