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

时间:2019-02-28 21:25:35

标签: java android android-layout android-menu

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

一般说明:我不希望支持旧的SDK(<7)。另外,我使用的手机(LG Stylo3 7.0)的硬件中没有菜单按钮。 我的目标是支持minSdkVersion 21和targetSdkVersion 28。我也不打算扩展片段。我还写了许多其他活动,尽管没有适当的菜单导航也无法访问其内容。

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

app / [package] /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 / 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中尝试了各种带/不带ActionBar的android:themes ...尤其是:( Theme.AppCompat.Light.DarkActionBar和Theme.AppCompat。 NoActionBar)。前一个主题显示空白的屏幕,后一个主题显示深灰色的

请让我知道是否需要我省略的其他文件来进行进一步诊断。我的假设是,这与我使用的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

1 个答案:

答案 0 :(得分:0)

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

public class MainActivity extends AppCompatActivity {

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

Why this works...是AppCompatActivity和基类Activity之间的区别。 AppCompatActivity继承自Activity,使用这些主题之一告诉应用程序使用本机ActionBar类提供应用程序栏。通常,使用新的工具栏对象似乎是最好的方法,因为它允许更多自定义(自2019年起)。围绕该主题的大多数早期问题都使用过时/过时的代码,例如ActionBarActivity。

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