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

问题描述 投票:0回答:1

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

一般说明:我不打算支持旧的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;

注意:我尝试在onCreateOptionsMenu()中调用super,并在return语句中调用它。我也尝试过扩展AppCompatActivity而不是Activity,但我不打算支持早期的SDK版本。我在onCreateOptionsMenu()中添加了断点,并且调试工具似乎没有停在这里。也许没有从onStart()调用onCreateOptionsMenu()?

RES /菜单/ 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>

注意:Android Studio能够毫无问题地预览此xml。

RES /布局/ 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>

注意:我在此布局中创建了一个工具栏对象,之前DOES只能处理此问题,而不是工具栏。 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.NoActionBar)。前一主题导致白色空白屏幕,后者导致深灰色。

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

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

  1. Implementing an option menu in Android Studio
  2. Add a menu to an empty activity
  3. Activity does not have an options menu - 不想使用ToolBar!
  4. how to display an option menu when an activity starts
java android android-layout android-menu
1个回答
0
投票

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

public class MainActivity extends AppCompatActivity {

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

Why this works...是AppCompatActivity和基类Activity之间的差异。 AppCompatActivity继承自Activity,并使用其中一个主题告诉应用程序使用本机ActionBar类来提供应用栏。通常,似乎使用新的Toolbar对象是最好的方法,因为它允许更多的自定义(截至2019年)。围绕此主题的大多数早期问题使用过时/弃用的代码,例如ActionBarActivity。

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

© www.soinside.com 2019 - 2024. All rights reserved.