web-dev-qa-db-ja.com

onCreateOptionsMenuが呼び出されることはありません

Androidでオプションメニューを機能させるのに問題があります。以前にアプリを作成しましたが、すべて正常に機能しましたが、メニューがポップアップしません。

コード:

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);

    getMenuInflater().inflate(R.menu.activity_video, menu);
    return true;
}

メソッド全体が呼び出されることさえありません(ブレークポイントを設定してチェックされます)。アクティビティは非常にシンプルで、VideoViewが設定されたOnTouchListenerのみが含まれています。

Samsung Galaxy 10.1、APIレベル15、minSDK 15でAndroid 4.0.4を使用しています。何か不足していますか?

50

テストする電話機にonCreateOptionsMenuのメニューボタンがある場合、テーマの起動時に呼び出されません。

Android:theme="@Android:style/Theme.Black.NoTitleBar"

ただし、メニューボタンをクリックすると、onCreateOptionsMenuが呼び出されます。ハードウェアボタンのない携帯電話で何が起こるかわかりません...

28
Warpzit

最新バージョンのAndroidツールバーにcompatライブラリを使用する場合、これが起こることは非常に一般的です。ツールバーにメニュー項目を表示するには、以下を実行する必要があります。

mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
64
Martin Cazares

最初にsetHasOptionsMenuからonCreate関数を呼び出します。 onCreateOptionsMenuが自動的に呼び出されます。

41
noahutz

メソッド:Fragment#onCreateView(...)に以下を配置する必要があります。

setHasOptionsMenu(true);

次に、メソッドが呼び出されます。

21
Sterling Diaz

私は同じ問題を抱えていました(メニューが表示されない、onCreateOptionsMenuが呼び出されない)。

フラグメント内でこれを呼び出す場合、public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)ではなくpublic boolean onCreateOptionsMenu(Menu menu)をオーバーライドする必要があります。 Fragmentsは後者を使用しないので、呼び出しさえしません。

アクティビティメニュー

フラグメントメニュー

4
Danny Libin

同じ問題がありました。私の問題は、異なるアクティビティクラスの継承によって解決されました。

だから私はやっていた:

パブリッククラスWelcomeActivityはActivityを拡張します

しかしこれを次のように変更しました:

パブリッククラスWelcomeActivityはAppCompatActivityを拡張します

このように、アクションにアクションバーを追加できると言っていました。

2
P Wilson

これは、アクティビティにツールバーがないであるためです。

それを追加するために。最初に、res。/ layoutにあるactivity.xmlにツールバーを追加する必要があります

<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:app="http://schemas.Android.com/apk/res-auto"
    xmlns:tools="http://schemas.Android.com/tools"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"">

    <!-- add this part-->
    <Android.support.v7.widget.Toolbar
        Android:id="@+id/toolbar"
        Android:layout_width="0dp"
        Android:layout_height="wrap_content"
        Android:background="?attr/colorPrimary"
        Android:minHeight="?attr/actionBarSize"
        Android:theme="?attr/actionBarTheme"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</Android.support.constraint.ConstraintLayout>

次に、アクティビティに追加させます

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);

またはコトリンで

val toolbar = findViewById<Toolbar>(R.id.toolbar)
setSupportActionBar(toolbar)
1
Allen

たぶん、あなたも過労している onKeyDown メソッドとそれが常に返すようにしました 本当。 trueを返すことは、keyEventがそれ以上伝播されないようにすることを意味します。以下のコードを参照してください:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
        /*
          handling event
         */
        return true; //onCreateOptionsMenu won't be invoked.
}
1
Adam

私は同様の問題を抱えていましたが、コミュニティと共有している別のソリューションがありました(何が起こっているのかを理解するのに1時間かかりました)。

    abstract class BaseActivity : AppCompatActivity{
      override fun onCreate(savedInstanceState: Bundle?) {
      setSupportActionBar(my_toolbar)
      }
    }
    class MyActivity : BaseActivity{
        // TODO : some good stuff
    }

my_toolbarは、dataBindingを使用してxmlファイルに作成されたオブジェクトです。

問題は同じように見え、ツールバーが表示されず、onCreateOptionsMenuが呼び出されません。

私の解決策は、my_toolbarが子クラスの構築時にのみ初期化されるため、このコードをその基本クラスではなく子クラスに昇格させることでした。

0
AnthonyCFE