ここに私の問題があります。私は、タブでActionBar Sherlockを使用しているアプリケーションを持っており、オプションメニュー付きのフラグメントもあります。私がエミュレータを回転させるたびに、隠れた/削除されたフラグメントさえも、すべてのフラグメントのメニューが追加されます(私は両方を試しました)。onCreateOptionsMenuがタブを使用してActionBarで何回も呼び出されています
これは設定です:タブのすべてが同じリスナーを使用
final ActionBar bar = getSupportActionBar();
bar.addTab(bar.newTab()
.setText("1")
.setTabListener(new MyTabListener(new FragmentList1())));
bar.addTab(bar.newTab()
.setText("2")
.setTabListener(new MyTabListener(new FragmentList2())));
bar.addTab(bar.newTab()
.setText("3")
.setTabListener(new MyTabListener(new FragmentList3())));
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
bar.setDisplayShowHomeEnabled(true);
bar.setDisplayShowTitleEnabled(true);
でアクションバーを持っている一つのFragmentActivityは、:
private class MyTabListener implements ActionBar.TabListener {
private final FragmentListBase m_fragment;
public MyTabListener(FragmentListBase fragment) {
m_fragment = fragment;
}
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
FragmentManager fragmentMgr = ActivityList.this.getSupportFragmentManager();
FragmentTransaction transaction = fragmentMgr.beginTransaction();
transaction.add(R.id.frmlyt_list, m_fragment, m_fragment.LIST_TAG);
transaction.commit();
}
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
FragmentManager fragmentMgr = ActivityList.this.getSupportFragmentManager();
FragmentTransaction transaction = fragmentMgr.beginTransaction();
transaction.remove(m_fragment);
transaction.commit();
}
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
}
FragmentListBaseの各サブクラスは、独自のメニューを持っているため、すべての3つのサブクラスは:
setHasOptionsMenu(true);
および適切な
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
Log.d(TAG, "OnCreateOptionsMenu");
inflater.inflate(R.menu.il_options_menu, menu);
}
私がアプリケーションを実行すると、onCreateOptionsMenuがすべての異なるフラグメントに対して複数回呼び出されていることがわかります。
私は完全に困惑しています。
できるだけ多くのコードを投稿してみましたが、何かが見つからない場合はアドバイスをお願いします。
[編集] さらにロギングを追加しました。フラグメントがローテーション中に2回(またはそれ以上)添付されていることが判明しました。私が気づくことの一つは、onCreate()メソッドが1回だけ呼び出されていることを除いて、すべてが複数回呼び出されていることです。
06.704:/WindowManager(72): Setting rotation to 0, animFlags=0
06.926:/ActivityManager(72): Config changed: { scale=1.0 imsi=310/260 loc=en_US touch=3 keys=1/1/2 nav=1/2 orien=L layout=0x10000014 uiMode=0x11 seq=35}
07.374:/FragmentList1(6880): onAttach
07.524:/FragmentList1(6880): onCreateView
07.564:/FragmentList1(6880): onAttach
07.564:/FragmentListBase(6880): onCreate
07.564:/FragmentList1(6880): OnCreateOptionsMenu
07.574:/FragmentList1(6880): OnCreateOptionsMenu
07.604:/FragmentList1(6880): onCreateView
[編集2]
[OK]を、私は(私がこの記事を短くするために編集されていること)Androidのコードに遡っ開始し、ここでこの部分を発見しました。
/com_actionbarsherlock/src/android/support/v4/app/FragmentManager.java
public boolean dispatchCreateOptionsMenu(Menu menu, MenuInflater inflater) {
if (mActive != null) {
for (int i=0; i<mAdded.size(); i++) {
Fragment f = mAdded.get(i);
if (f != null && !f.mHidden && f.mHasMenu) {
f.onCreateOptionsMenu(menu, inflater);
}
}
}
問題がonCreateOptionsMenu()メソッド」であるのでmAddedが実際に、その中にFragmentList1の複数のインスタンスを持っているということですFragmentList1クラスの異なるインスタンスに対して3回呼び出されます。私が理解できないことは、そのクラスが何度も追加されている理由です...しかし、それは良いリードの地獄です。
この回答はあまりにも複雑です。 * ActionBar *にタブを追加する前に 'bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)'に移動するだけで問題は解決しました。 – Phil