2012-11-28 55 views
3

所以我一直在努力和Android應用程序的頂部有一個導航欄與幾個選項卡,該部分工作正常,但現在我想能夠動態地添加菜單項目從不同碎片中的操作欄(因爲一些碎片可能有不同的選項)。到目前爲止,無論我嘗試過什麼,我都無法獲得要調用的onCreateOptionsMenu。這裏是我到目前爲止從SherlockActionBar Fragment選項卡動態添加菜單項

//First I have a holder class that is used to navigate between the different Fragment Tabs 
public class ActionHolder extends SherlockFragmentActivity implements ActionBar.TabListener {.... 
//And then I have this method for switching Fragments based on what Tab is selected 
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) { 
    // TODO Auto-generated method stub 
    int selectedTab = tab.getPosition(); 

    if (selectedTab == 0) { 
     SalesMainScreen salesScreen = new SalesMainScreen(); 
     ft.replace(R.id.content, salesScreen); 
    } 
    else if (selectedTab == 1) { 
     ClientMainScreen clientScreen = new ClientMainScreen(); 
     ft.replace(R.id.content, clientScreen); 
    }..... 

現在這裏是標籤的片段(該SalesMainScreen),我想有幾個菜單項添加到操作欄

@Override 
public void onCreate (Bundle savedInstanceState) { 
    Log.i("message","the oncreate method was called"); 
    setHasOptionsMenu(true); 
    super.onCreate(savedInstanceState); 

} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) { 
    return inflater.inflate(R.layout.salesmainscreen, group, false); 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    Log.i("message", "the oncreatemenu method called"); 
    inflater.inflate(R.menu.menu_refresh, menu); 
    super.onCreateOptionsMenu(menu, inflater); 
} 

我看到OnCreate中的一個日誌消息被調用,但我沒有看到onCreateOptionsMenu日誌被調用。此外,我知道有時導入會導致問題,但是當我導入Sherlock Menu和Menu Inflater時,我會在OnCreateOptionMenu方法上獲得關於它們不兼容的各種錯誤消息。是否可以在此設置中將菜單項動態添加到操作欄中,或者我應該只添加項目,然後對那些不適用於正在顯示的片段的項目執行任何操作?

+0

可能必須與super.onCreate(savedInstanceState);追隨setHasOptionsMenu(true); ?會覆蓋一切嗎? – RdPC

回答

5

我有一個應用程序使用SherlockActionBar和選項卡,每個選項卡包含SherlockFragment。主要活動在操作欄中有其自己的菜單,其中一個片段將搜索項添加到操作欄菜單。

主要活動有以下幾點:

class MainActivity extends SherlockFragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ...   
     ActionBar bar = getSupportActionBar(); 
     bar.addTab(createThingOneTab()); 
     bar.addTab(createThingTwoTab()); 
     bar.addTab(createThingThreeTab()); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getSupportMenuInflater().inflate(R.menu.activity_main, menu); 
    } 

} 

選項卡中的片段有以下幾點:

class ThingOneFragment extends SherlockFragment { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     ... 
     setHasOptionsMenu(true); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     MenuItem search = menu.add("Search"); 
     search.setIcon(android.R.drawable.ic_menu_search); 
     search.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); 
     ... 
    } 

} 

當我開始的主要活動中,標籤顯示ThingOneFragment默認情況下,我看到操作欄中的搜索圖標。當我選擇其他選項卡時,搜索圖標消失。你需要確保你使用的是大偵探類MenuMenuInflater

我不知道這是否有差別,但我TabListener看起來是這樣的:

private TabListener createTabListener(final Class<? extends Fragment> clazz) { 
    return new TabListener() { 

     private Fragment mFragment; 

     @Override 
     public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
      // no action 
     } 

     @Override 
     public void onTabSelected(Tab tab, FragmentTransaction ft) { 
      if (mFragment == null) { 
       mFragment = Fragment.instantiate(activity, clazz.getName()); 
      } 
      getSupportFragmentManager().beginTransaction() 
             .replace(android.R.id.content, mFragment) 
             .commit(); 
     } 

     @Override 
     public void onTabReselected(Tab tab, FragmentTransaction ft) { 
      // no action 
     } 
    }; 

我我不確定這是否會導致您的問題,或者它是否是處理標籤的正確方式,但我將其包含在內以確保完整性。

+0

@John我有同樣的問題..你可以請發佈更多的代碼示例嗎?像執行createThingOneTab()和其他函數?謝啦! –