如何使用 AndroidX 为 Activity 创建选项菜单?

How to create an options menu for an Activity using AndroidX?

阅读了大部分官方 android 文档后,我 运行 在不使用 的情况下设置 Appbar 时遇到了麻烦 Toolbar object. Funnily, this official page on Menus 链接到在 onCreate() 方法中使用 Toolbar 对象。虽然我最近得到了一个工具栏来工作,但我不需要额外的 flexibility/customization 工具栏对象,而是选择使用各种菜单 xml 文件来进行我的活动。 问题是:我的选项菜单代码没有生成任何类型的应用程序栏...它只生成一个带有任务栏的空白屏幕(battery/time 栏)在上面。

一般注意事项:我不希望支持旧的 SDK (< 7)。此外,我使用的 phone (LG Stylo3 7.0) 在硬件中没有菜单按钮。 我的目标是支持 minSdkVersion 21,targetSdkVersion 28。我也没有扩展片段。我写了很多其他活动,尽管如果没有适当的菜单导航就无法访问它们的内容。

以下code/resources是我写的:

应用/[包]/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;

注意:我试过在 onCreateOptionsMenu() 中调用 super 并在 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>

注意:我在res/values/styles.xml中尝试了各种android:themes with/without ActionBar ...特别是: (Theme.AppCompat.Light.DarkActionBar 和 Theme.AppCompat.NoActionBar)。前者主题导致空白屏幕,后者导致深灰色。

如果我遗漏的其他文件需要进一步诊断,请告诉我。我的假设是它与我正在使用的 constraintLayout 有关。

这些是我查看过但对解决我的问题没有帮助的页面:

  1. -- 不想用ToolBar!
  2. how to display an option menu when an activity starts

更改 MainActivity.java 文件构造函数行以扩展 AppCompatActivity

public class MainActivity extends AppCompatActivity {

并将 android:theme 设置为 Theme.AppCompat* 的变体显示了我一直在努力显示的 MainActivity Appbar。接下来是我为找到合适的解决方案所做的更多研究。

是 AppCompatActivity 和基础 class Activity 之间的区别。 AppCompatActivity 继承自 Activity 并使用这些主题之一告诉应用程序使用本机 ActionBar class 来提供应用程序栏。一般来说,使用新的 Toolbar 对象似乎是最好的方法,因为它允许进行更多自定义(截至 2019 年)。大多数围绕该主题的早期问题使用 outdated/deprecated 代码,例如 ActionBarActivity.

这是通过更改 Activity 的布局文件以根据此 documentation 包含工具栏来实现的。然后可以使用此问题范围之外的技术适当修改工具栏的主题。