提问者:小点点

如何使用AndroidX创建一个活动的选项菜单?


在阅读了大部分官方android留档后,我遇到了在不使用工具栏对象的情况下设置Appbar的问题。有趣的是,菜单上的这个官方页面链接到在on创建()方法中使用工具栏对象。虽然我最近得到了一个工具栏来工作,但我不需要工具栏对象的额外灵活性/自定义,而是选择为我的活动使用各种菜单xml文件。问题是:我的选项菜单代码不会生成任何类型的Appbar…它只会生成一个空白的白色屏幕,上面有任务栏(电池/时间条)。

一般说明:我不希望支持旧的SDK(

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

app/[包]/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。

分辨率/布局/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允许我预览这个,它是一个空白屏幕。

Android清单.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...值得注意的是:(主题。AppCompat.Light.DarkActionBar和Theme。AppCompat.NoActionBar)。前一个主题导致空白的白色屏幕,后一个主题导致深灰色。

如果我省略的其他文件需要进一步诊断,请务必告诉我。我的假设是它与我正在使用的约束布局有关。

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

  1. 在Android Studio中实现选项菜单
  2. 将菜单添加到空活动
  3. 活动没有选项菜单--不想使用ToolBar
  4. 如何在活动开始时显示选项菜单

共1个答案

匿名用户

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

public class MainActivity extends AppCompatActivity {

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

为什么这有效...是 AppCompatActivity 和基类 Activity 之间的差异。AppCompatActivity 继承自活动,使用这些主题之一会告知应用使用本机 ActionBar 类来提供应用栏。一般来说,使用新的工具栏对象似乎是最好的方法,因为它允许更多的自定义(截至 2019 年)。围绕此主题的大多数早期问题都使用过时/已弃用的代码,例如 ActionBarActivity。

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