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

标签 java android android-layout android-menu

在阅读了大部分官方 android 文档之后,我在使用 Toolbar object 设置 Appbar 时遇到了麻烦。 .有趣的是,this official page on Menus 链接到在 onCreate() 方法中使用 Toolbar 对象。虽然我最近得到了一个 Toolbar 来工作,但我不需要 Toolbar 对象的额外灵 active /自定义,而是选择为我的 Activity 使用各种菜单 xml 文件。 问题是:我的选项菜单代码不会产生任何类型的应用栏...它只会产生一个空白屏幕,顶部是任务栏(电池/时间栏)。

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

以下代码/资源是我写的:

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

注意:我已经在此布局中创建了一个 Toolbar 对象,在此之前它确实有效,但这个问题与 Toolbars 无关。 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 中尝试了各种带/不带 ActionBar 的 android:themes...特别是:(Theme.AppCompat.Light.DarkActionBar 和 Theme.AppCompat。没有 Action 条)。前者主题导致空白屏幕,后者导致深灰色。

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

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

  1. > Implementing an option menu in Android Studio
  2. > Add a menu to an empty activity
  3. > Activity does not have an options menu -- 不想使用工具栏!
  4. > how to display an option menu when an activity starts

最佳答案

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

public class MainActivity extends AppCompatActivity {

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

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

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

关于java - 如何使用 AndroidX 为 Activity 创建选项菜单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54934514/

相关文章:

java - 如何找到给定整数数组中最长的奇数和子数组? (以最有效的方式)

java - Spring-返回对象列表的请求方法显示错误

java - Android 谷歌地图在手机中显示但未在平板电脑中显示

android - 检测 Action 是否在溢出或 Action 栏中

android - 自定义进度条的 Wrap_content 总是产生相同的大小

java - 为什么 FirebaseInstanceIdService 服务在 Firebase 新更新中丢失了?

java - 游戏在导出的 jar 中以 18 fps 运行,在 Eclipse 中以 40 fps 运行?

Android - 新数据记录被添加到错误的联系人

android - 圆形图像按钮android

android - 如何在 Android 中全局锁定屏幕方向?