這是我的問題。我有一個應用程序,我正在使用帶有選項卡的選項卡和片段的ActionBar Sherlock。每次旋轉模擬器時,都會爲所有片段添加菜單,即使是那些被隱藏/刪除的片段(我都嘗試過)。onCreateOptionsMenu在ActionBar中使用標籤被調用的次數太多
這是設置:一個FragmentActivity,具有與
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);
的動作條中的選項卡都使用相同的監聽器:
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被多次調用,用於所有不同的片段。
我完全難住。
我嘗試發佈儘可能多的代碼,而不是壓倒性的,如果你發現缺少某些東西,請告知。
[編輯] 我添加了更多的日誌記錄,事實證明該片段正在附加兩次(或更多)旋轉。我注意到的一件事是,除了僅被調用一次的onCreate()方法以外,所有內容都被多次調用。
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]
好吧,我開始回溯到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);
}
}
}
的問題是,mAdded確實有FragmentList1的多個實例中,所以在onCreateOptionsMenu()方法是「正確「被調用3次,但對於FragmentList1類的不同實例。我不明白的是爲什麼這個班級被多次添加......但這是一個很好的領先地位。
這個答案太複雜了。在將選項卡添加到* ActionBar *之前,只需將該調用移動到'bar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS)'解決了我的問題。 – Phil