Как создать меню параметров для действия с помощью AndroidX?

Прочитав большую часть официальной документации по Android, я столкнулся с проблемой настройки панели приложений без использования Объект панели инструментов. Как ни странно, эта официальная страница в меню ссылается на использование объект панели инструментов в методе onCreate(). Хотя в недавнем прошлом у меня была панель инструментов для работы, мне не нужна дополнительная гибкость/настройка объекта панели инструментов, и вместо этого я предпочитаю использовать различные XML-файлы меню для своих действий. Проблема: мой код для меню опций не создает никакой панели приложений... он создает только пустой белый экран с панелью задач (батареи/времени) сверху.

Общие примечания: я не собираюсь поддерживать старые SDK (‹ 7). Кроме того, телефон, которым я пользуюсь (LG Stylo3 7.0), НЕ имеет аппаратной кнопки меню. Я стремлюсь поддерживать minSdkVersion 21 с targetSdkVersion 28. Я также не расширяю фрагмент. У меня выписано много других активностей, хотя их содержимое недоступно без надлежащей навигации по меню.

Я написал следующий код/ресурсы:

приложение/[пакет]/MainActivity.java

package [package];

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import androidx.appcompat.app.AppCompatActivity;    
import [package].R;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

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

Примечание. Я пробовал вызывать super в onCreateOptionsMenu(), а также вызывать его в операторе return. Я также пытался расширить AppCompatActivity вместо Activity, но я не собираюсь поддерживать ранние версии SDK. Я поставил точки останова в onCreateOptionsMenu(), и инструмент отладки, похоже, не останавливается на достигнутом. Возможно, onCreateOptionsMenu() не вызывается из onStart()?

res/menu/main_menu.xml

<menu 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"
    tools:context=".MainActivity" >

    <item android:id="@+id/action_servers"
        android:icon="@drawable/ic_action_server"
        android:title="@string/action_server"
        app:showAsAction="ifRoom" />

    <item android:id="@+id/action_settings"
        android:icon="@drawable/ic_action_settings"
        android:title="@string/action_settings"
        app:showAsAction="ifRoom"/>
</menu>

Примечание. AndroidStudio может без проблем просмотреть этот XML-файл.

res/layout/activity_main.xml

<androidx.constraintlayout.widget.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:id="@+id/swipe_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <!-- Some commented out stuff for now -->

</androidx.constraintlayout.widget.ConstraintLayout>

Примечание. Я создал объект панели инструментов в этом макете, до которого ДЕЙСТВИТЕЛЬНО работает, только этот вопрос не касается панелей инструментов. AndroidStudio позволяет мне просмотреть это, и это пустой экран.

AndroidManifest.xml

<application
    android:allowBackup="false"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Примечание. Я пробовал различные темы android: с ActionBar или без него в res/values/styles.xml... в частности: (Theme.AppCompat.Light.DarkActionBar и Theme.AppCompat.NoActionBar). Первая тема приводит к пустому белому экрану, вторая — к темно-серому.

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

Это страницы, которые я просмотрел, но которые не помогли решить мою проблему:

  1. Реализация меню параметров в Android Studio
  2. Добавить меню в пустое действие
  3. Действие не имеет меню параметров — не хочет использовать панель инструментов !
  4. как отобразить меню параметров при запуске действия

person jsonV    schedule 28.02.2019    source источник


Ответы (1)


Изменение строки конструктора файла MainActivity.java для расширения AppCompatActivity

public class MainActivity extends AppCompatActivity {

и установка темы android: в вариант Theme.AppCompat * показывает панель приложения MainActivity, которую я изо всех сил пытался показать. Далее следует еще одно исследование, которое я провел, чтобы найти правильное решение.

Почему это работает... — это различия между AppCompatActivity и базовый класс Activity. AppCompatActivity наследуется от Activity, и использование одной из этих тем указывает приложению использовать собственный класс ActionBar для предоставления панели приложения. Как правило, кажется, что использование нового объекта панели инструментов — лучший способ, поскольку он позволяет больше настроек (по состоянию на 2019 год). В большинстве более ранних вопросов, связанных с этой темой, используется устаревший/устаревший код, такой как ActionBarActivity.

Это достигается путем изменения файла макета действия для включения панели инструментов в соответствии с этим документация. Затем тему панели инструментов можно соответствующим образом изменить, используя методы, выходящие за рамки этого вопроса.

person jsonV    schedule 28.02.2019