Подтвердить что ты не робот

OnCreateOptionsMenu никогда не называется

У меня возникли проблемы с выбором меню опций, работающим в Android. Я создавал приложения раньше, и все они отлично работали, но теперь меню просто не появляется.

Код:

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

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

весь метод никогда не называется (проверяется установкой точки останова). Активность суперпростая, она просто имеет VideoView в ней с набором OnTouchListener.

Я использую Android 4.0.4 на Samsung Galaxy 10.1, уровень API 15, minSDK 15. Я что-то пропустил?

4b9b3361

Ответ 1

Если на телефоне, на котором вы тестируете, есть кнопка меню onCreateOptionsMenu, не будет вызываться при запуске с темой:

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

Но когда вы нажимаете кнопку меню, вызывается onCreateOptionsMenu. Я не знаю, что происходит на телефонах без аппаратных кнопок...

Ответ 2

В последних версиях Android при использовании библиотеки сопоставлений для панели инструментов очень часто случается, что для отображения элементов меню на панели инструментов вы должны сделать следующее:

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

Ответ 3

Сначала вызовите функцию setHasOptionsMenu из onCreate. onCreateOptionsMenu будет автоматически вызываться.

Ответ 4

В методе: Fragment#onCreateView(...) вы должны поставить:

setHasOptionsMenu(true);

Тогда ваш метод будет вызван.

Ответ 5

У меня была та же проблема (меню не отображается, onCreateOptionsMenu не вызывается).

Если вы вызываете это внутри фрагмента, вам нужно переопределить public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) not public boolean onCreateOptionsMenu(Menu menu). Fragments не использовать последнее, поэтому они никогда не смогут его назвать.

Меню действий

Фрагментное меню

Ответ 6

У меня была такая же проблема. Моя проблема была решена путем наследования другого класса активности.

Итак, я делал:

Открытый класс WelcomeActivity extends Activity

но изменил это на:

открытый класс WelcomeActivity расширяет AppCompatActivity

Таким образом, я говорил, что в вашу деятельность можно добавить панель действий.

Ответ 7

Возможно, у вас также есть метод overrode onKeyDown и он всегда возвращает true. Возвращение true означает, что keyEvent будет предотвращено дальнейшее распространение. См. Следующий код:

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

Ответ 8

Это потому, что наша деятельность не имеет панели инструментов.

Для того, чтобы добавить это. Во-первых, вам нужно добавить панель инструментов в файл activity.xml, который находится в res/layout

<?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)

Ответ 9

У меня была похожая проблема, но я поделился с сообществом другим решением (поскольку мне потребовался час, чтобы понять, что происходит):

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

где my_toolbar - это объект, созданный в моем XML файле с помощью привязки данных.

Проблема выглядит так же, панель инструментов не появляется, нет вызова onCreateOptionsMenu.

Моим решением было продвинуть этот код в дочерний класс, а не в базовый класс, поскольку my_toolbar инициализируется только при создании дочернего класса.

Ответ 10

  Если приведенный выше ответ не работает, убедитесь, что вы используете тот же id панели инструментов.

layout_app_bar.xml

<androidx.appcompat.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="?attr/actionBarSize">

activiy_main.xml

<include
    android:id="@+id/app_bar"
    layout="@layout/layout_app_bar" />

в Java файле:

не звоните:

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

пожалуйста, позвоните:

Toolbar tb = findViewById(R.id.app_bar);

Ответ 11

Try This Это работает для меня: ---

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    super.onCreateOptionsMenu(menu);
    getMenuInflater().inflate(R.menu.home_page_menu, menu);
    return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {

    switch (item.getItemId()) {
    case R.id.menu_delete:
        Toast.makeText(this, "You pressed the Delete!",
                 Toast.LENGTH_LONG).show();
        break;


      case R.id.menu_setting:
     Intent intent=new Intent(HomePage.this,Setting.class);
     startActivity(intent);
     finish();
     Toast.makeText(this, "You pressed the Setting!",
     Toast.LENGTH_LONG).show(); break;


    }

    return super.onOptionsItemSelected(item);
}