2

クラス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 の可視性を操作するために base でメソッドを作成しようとしましたが、メニューは常に 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);
}

FragmentB の onCreate() でそのメソッドを次のように呼び出します。

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

誰か助けてください....私は多くのチュートリアルを読みましたが、これを行うための答えが見つかりません。注:私は setHasOptionsMenu(true); でした。BaseFragment の oncreate で

4

3 に答える 3

0

コールバック以外ではメニューにアクセスできません。ActionProviderサブクラスを実装して、必要なメニュー項目の可視性を処理できます。

または、アクティビティの invalidateOptionsMenu() メソッドを呼び出して、オプション メニューの再作成を要求し、onCreateOptionsMenu() で項目の可視性を変更できます。

于 2014-01-15T09:11:32.617 に答える
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)Fragment クラスのメニュー項目を呼び出す onCreate() メソッドを追加します。

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

onCreateOptionsMenuFragment クラスで再度オーバーライドする必要はありません。Fragment で利用可能なメソッドをオーバーライドすることで、メニュー項目を変更 (追加/削除)onPrepareOptionsMenuできます。

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

}
于 2015-03-04T05:29:53.870 に答える
0

onCreateOptionsMenuFragmentB で再度オーバーライドするのが最も簡単な方法です。

@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;
}
于 2014-01-15T10:05:06.210 に答える