2014-01-15 67 views
1

我有一個類BaseFragment我是從如何創建動態菜單顯示在片段

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.main, menu); 
    this.menu = menu; 
} 

main.xml中創建一個私有的菜單和設置菜單我有:

<menu xmlns:android="http://schemas.android.com/apk/res/android" > 
<!-- Search/will display always --> 
<item android:id="@+id/action_search" 
     android:icon="@drawable/ic_action_search" 
     android:title="@string/action_search" 
     android:showAsAction="ifRoom"/> 

<!-- Refresh --> 
<item android:id="@+id/action_refresh" 
     android:icon="@drawable/ic_action_refresh" 
     android:title="@string/action_refresh" 
     android:showAsAction="ifRoom" /> 

<!-- Download --> 
<item android:id="@+id/action_download" 
     android:icon="@drawable/ic_action_download" 
     android:title="@string/action_download" 
     android:showAsAction="never"/> 

<!-- Favorite --> 
<item android:id="@+id/action_favorites" 
     android:icon="@drawable/ic_action_favorites" 
     android:title="@string/action_favorites" 
     android:showAsAction="never" /> 
</menu> 

和我有另一個片段FragmentAFragmentB延伸到BaseFragment。 在FragmentA我想顯示所有菜單,並在運行應用程序時一切正常,但在FragmentB我想顯示下載和最喜歡的白板搜索和刷新。

我嘗試在基礎上創建一個方法來操縱menuitem上的可見性,我的菜單總是返回null。

protected void setSearchable(boolean isSearchable){ 
    menu.findItem(R.id.action_search).setVisible(isSearchable); 
} 
protected void setHasRefreshFuction(boolean isHasRefreshFunction){ 
    menu.findItem(R.id.action_refresh).setVisible(isHasRefreshFunction); 
} 
protected void setDownloadable(boolean isDownloadable){ 
    menu.findItem(R.id.action_download).setVisible(isDownloadable); 
} 
protected void setFavorite(boolean isFavorite){ 
    menu.findItem(R.id.action_favorites).setVisible(isFavorite); 
} 

我呼籲的onCreate()這個方法在FragmentB這樣的:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setDownloadable(true); 
    setFavorite(true); 
    setHasRefreshFuction(false); 
    setSearchable(false); 
} 

有人可以幫我請....我是看了很多教程,並沒有找到一個答案,使這個。 注意:我是setHasOptionsMenu(true);在BaseFragment中創建

回答

0

最簡單的方法是再覆蓋FragmentB onCreateOptionsMenu

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    inflater.inflate(R.menu.main, menu); 
    menu.findItem(R.id.action_search).setVisible(false); 
    menu.findItem(R.id.action_refresh).setVisible(false); 
    this.menu = menu; 
} 
+0

Thank's @ super-qua我有你的代碼的解決方案。我打電話: setDownloadable(true); setFavorite(true); setHasRefreshFuction(false); setSearchable(false);來自onCreateOptionsMenu重寫方法的 ,它運行良好 –

0

你不能訪問它的回調之外的菜單。因爲您可以實現ActionProvider子類來處理所需菜單項的可見性。

或者您也可以撥打invalidateOptionsMenu您的活動要求選項菜單再創造的()方法,並在onCreateOptionsMenu(項目的變化可見性)

0

menu.xml你應該添加所有的菜單項。然後,您可以隱藏您在初始加載時不想看到的項目。

<item 
    android:id="@+id/action_newItem" 
    android:icon="@drawable/action_newItem" 
    android:showAsAction="never" 
    android:visible="false" 
    android:title="@string/action_newItem"/> 

添加setHasOptionsMenu(true)在onCreate()方法來調用您的片段類的菜單項。

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

你不需要在你的Fragment類中再次覆蓋onCreateOptionsMenu。通過覆蓋片段中可用的方法onPrepareOptionsMenu可以更改菜單項目(Add/remoev)。

@Override 
public void onPrepareOptionsMenu(Menu menu) { 
    menu.findItem(R.id.action_newItem).setVisible(true); 
    super.onPrepareOptionsMenu(menu); 

}