441

フラグメントのグループからオプション メニューに項目を追加しようとしています。

新しいMenuFragmentクラスを作成し、メニュー項目を含めたいフラグメント用にこれを拡張しました。コードは次のとおりです。

ジャワ:

public class MenuFragment extends Fragment {

    MenuItem fav;

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

    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        fav = menu.add("add");
        fav.setIcon(R.drawable.btn_star_big_off);
    }
}

コトリン:

class MenuFragment : Fragment {

    lateinit var fav: MenuItem

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        fav = menu.add("add");
        fav.setIcon(R.drawable.btn_star_big_off);
    }
}

何らかの理由でonCreateOptionsMenu実行されていないように見えます。

4

21 に答える 21

667

スーパー メソッドを呼び出します。

ジャワ:

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

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // TODO Add your menu entries here
        super.onCreateOptionsMenu(menu, inflater);
    }

コトリン:

    override fun void onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }

    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        // TODO Add your menu entries here
        super.onCreateOptionsMenu(menu, inflater)
    }

コードにログ ステートメントを挿入して、メソッドが呼び出されていないかどうか、またはメニューがコードによって修正されていないかどうかを確認します。

また、オプション メニューの処理に参加する必要があることをフラグメントに通知するために呼び出していることを確認setHasOptionsMenu(boolean)してください。onCreate(Bundle)

于 2011-11-29T10:29:38.177 に答える
216

私は同じ問題を抱えていましたが、それを機能させるための最後のステップを要約して紹介する方が良いと思います:

  1. Fragment のメソッドに setHasOptionsMenu(true) メソッドを追加しますonCreate(Bundle savedInstanceState)

  2. onCreateOptionsMenu(Menu menu, MenuInflater inflater)(フラグメントのメニューで何か違うことをしたい場合) とフラグメントのメソッドをオーバーライドonOptionsItemSelected(MenuItem item)します。

  3. アクティビティのメソッド内onOptionsItemSelected(MenuItem item)で、メニュー項目アクションがonOptionsItemSelected(MenuItem item)Fragment のメソッドに実装される場合は false を返すようにしてください。

例:

アクティビティ

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getSupportMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case R.id.activity_menu_item:

            // Do Activity menu item stuff here
            return true;

        case R.id.fragment_menu_item:

            // Not implemented here
            return false;
        default:
            break;
    }

    return false;
}

断片

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

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Do something that differs the Activity's menu here
    super.onCreateOptionsMenu(menu, inflater);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case R.id.activity_menu_item:

            // Not implemented here
            return false;
        case R.id.fragment_menu_item:

            // Do Fragment menu item stuff here
            return true;

        default:
            break;
    }

    return false;
}
于 2013-08-19T16:52:53.717 に答える
161

メソッドが呼び出されていないことがわかった場合は、フラグメントのメソッドonCreateOptionsMenu(Menu menu, MenuInflater inflater)から次の呼び出しを行ってください。onCreate(Bundle savedInstanceState)

setHasOptionsMenu(true)
于 2012-10-03T06:16:22.980 に答える
26

で、menu.xmlすべてのメニュー項目を追加する必要があります。その後、初期ロードで表示したくないアイテムを非表示にすることができます。

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() メソッドを追加します。

FragmentClass.java

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

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

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

}
于 2015-03-04T05:36:37.837 に答える
20

私の場合、手順は次のとおりです。

ステップ1

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Here notify the fragment that it should participate in options menu handling.
    setHasOptionsMenu(true);
}

ステップ2

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // First clear current all the menu items
    menu.clear();

    // Add the new menu items
    inflater.inflate(R.menu.post_stuff, menu);

    super.onCreateOptionsMenu(menu, inflater);
}

ステップ-3

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.post_stuff:
            Log.d(TAG, "Will post the photo to server");
            return true;
        case R.id.cancel_post:
            Log.d(TAG, "Will cancel post the photo");
            return true;
        default:
            break;
    }
    return super.onOptionsItemSelected(item);
}
于 2018-02-06T23:47:34.103 に答える
8

メニューのカスタムを追加したい場合

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

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    inflater.inflate(R.menu.menu_custom, menu);
}
于 2016-06-23T18:26:18.530 に答える
7

私は同じ問題を抱えていました.私のフラグメントはViewPagerのページでした. FragmentPagerAdapter をインスタンス化するときに、アクティビティ サポート フラグメント マネージャーではなく、子フラグメント マネージャーを使用していたためです。

于 2013-07-26T15:04:52.420 に答える
3

メニューファイル:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/play"
        android:titleCondensed="Speak"
        android:showAsAction="always"
        android:title="Speak"
        android:icon="@drawable/ic_play">
    </item>
    <item
        android:id="@+id/pause"
        android:titleCondensed="Stop"
        android:title="Stop"
        android:showAsAction="always"
        android:icon="@drawable/ic_pause">
    </item>
</menu>

活動コード:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.speak_menu_history, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case R.id.play:
            Toast.makeText(getApplicationContext(), "speaking....", Toast.LENGTH_LONG).show();
            return false;

        case R.id.pause:
            Toast.makeText(getApplicationContext(), "stopping....", Toast.LENGTH_LONG).show();
            return false;

        default:
            break;
    }

    return false;
}

フラグメント コード:

@Override

public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        case R.id.play:
            text = page.getText().toString();
            speakOut(text);

            // Do Activity menu item stuff here
            return true;

        case R.id.pause:
            speakOf();

            // Not implemented here
            return true;

        default:
            break;
    }
    return false;
}
于 2015-11-21T16:48:02.400 に答える
3

あなたのコードは問題ありません。メソッドにスーパーのみがありませんでした:

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO add your menu : 
    inflater.inflate(R.menu.my_menu, menu);
    //TODO call super
    super.onCreateOptionsMenu(menu, inflater);
}
于 2017-09-26T07:57:26.783 に答える
1

これに追加することと、それがうまくいかなかった理由の1つ。

ナップスターの回答に似ています。

  1. AppCompatActivityフラグメントのホスティング アクティビティが拡張されていることを確認してくださいFragmentActivity

    public class MainActivity extends AppCompatActivity {
    
    }
    

    FragmentActivityの Google リファレンスドキュメントから:

    注: アクション バーを含むアクティビティを実装する場合は、代わりにこのクラスのサブクラスである ActionBarActivity クラスを使用する必要があります。これにより、API レベル 7 以降で Fragment API を使用できるようになります。

  2. Napster の回答を更新するにActionBarActivityは、現在非推奨になっているため、AppCompatActivity代わりに使用してください。

  3. をご利用AppCompatActivityの際は、「活動テーマを~Theme.AppCompatまたは類似のテーマ」(Google Doc)に設定してください。

注:クラスandroid.support.v7.app.AppCompatActivityのサブクラスですandroid.support.v4.app.FragmentActivity( AppCompatActivity ref doc を参照)。

于 2015-10-22T23:54:19.923 に答える
1

私の問題は少し異なっていました。私はすべてを正しく行いました。しかし、フラグメントをホストするアクティビティの間違ったクラスを継承していました。

したがって、明確にするonCreateOptionsMenu(Menu menu, MenuInflater inflater)ために、フラグメントでオーバーライドする場合は、このフラグメントをホストするアクティビティ クラスが継承されていることを確認してくださいandroid.support.v7.app.ActionBarActivity(API レベル 11 未満をサポートする場合)。

android.support.v4.app.FragmentActivityAPI レベル 11 未満をサポートするために を継承していました。

于 2015-04-19T19:23:04.863 に答える
0

これは、フラグメントが読み込まれたときと破棄されたときに、すべてのメニュー オプションを非表示および非表示にするために行ったことです。nullforを指すリスクを回避しR.id.your_menu_item、フラグメントを別の場所で再利用できるようにしました。

lateinit var optionsMenu: Menu

override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
    menu.iterator().forEach {
        it.isVisible = false
    }
    optionsMenu = menu
    super.onCreateOptionsMenu(menu, inflater)
}

override fun onDestroyView() {
    optionsMenu.iterator().forEach {
        it.isVisible = true
    }
    super.onDestroyView()
}
于 2021-07-22T18:53:21.873 に答える