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を使用しています。何か不足していますか?
テストする電話機にonCreateOptionsMenuのメニューボタンがある場合、テーマの起動時に呼び出されません。
Android:theme="@Android:style/Theme.Black.NoTitleBar"
ただし、メニューボタンをクリックすると、onCreateOptionsMenu
が呼び出されます。ハードウェアボタンのない携帯電話で何が起こるかわかりません...
最新バージョンのAndroidツールバーにcompatライブラリを使用する場合、これが起こることは非常に一般的です。ツールバーにメニュー項目を表示するには、以下を実行する必要があります。
mToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayShowTitleEnabled(false);
最初にsetHasOptionsMenu
からonCreate
関数を呼び出します。 onCreateOptionsMenu
が自動的に呼び出されます。
メソッド:Fragment#onCreateView(...)
に以下を配置する必要があります。
setHasOptionsMenu(true);
次に、メソッドが呼び出されます。
私は同じ問題を抱えていました(メニューが表示されない、onCreateOptionsMenu
が呼び出されない)。
フラグメント内でこれを呼び出す場合、public void onCreateOptionsMenu(Menu menu, MenuInflater inflater)
ではなくpublic boolean onCreateOptionsMenu(Menu menu)
をオーバーライドする必要があります。 Fragments
は後者を使用しないので、呼び出しさえしません。
同じ問題がありました。私の問題は、異なるアクティビティクラスの継承によって解決されました。
だから私はやっていた:
パブリッククラスWelcomeActivityはActivityを拡張します
しかしこれを次のように変更しました:
パブリッククラスWelcomeActivityはAppCompatActivityを拡張します
このように、アクションにアクションバーを追加できると言っていました。
これは、アクティビティにツールバーがないであるためです。
それを追加するために。最初に、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)
たぶん、あなたも過労している onKeyDown メソッドとそれが常に返すようにしました 本当。 trueを返すことは、keyEventがそれ以上伝播されないようにすることを意味します。以下のコードを参照してください:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
/*
handling event
*/
return true; //onCreateOptionsMenu won't be invoked.
}
私は同様の問題を抱えていましたが、コミュニティと共有している別のソリューションがありました(何が起こっているのかを理解するのに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が子クラスの構築時にのみ初期化されるため、このコードをその基本クラスではなく子クラスに昇格させることでした。