转换旧样式 Android 菜单以在新手机上使用

Convert an old style Android menu to work on newer phones

我的旧应用程序在主菜单上有一个简单的菜单 activity。它只有几个简单的选项,例如 "About" 导致弹出一个关于应用程序的一些信息。

它在模拟器 Nexus One (API23) 上完美运行,因为有一个模拟的物理菜单按钮。

但是,在大多数现代 phone 上,没有按钮,这意味着无法访问我的菜单。

我其实隐约记得 运行 几年前在 phone 上没有菜单按钮,但不知何故仍然可以访问菜单。可能记错了

(几天前我开始深入研究这个问题,并开始修改我的代码,主要的 activity 继承自比 Activity 更高级的东西,然后导致一些旧的 API版本被排除在外 - 事情很快就失去了控制。经过几个小时的 "maven gradle settings" 和 "Support Library" 的东西和许多 "AAPT2 errors" 的页面并且弄乱了我的整个系统试图修复它,我不得不扔掉所有东西并从存储库中获得一个新的克隆。幸运的是我还可以修复我对系统所做的其他更改。)

如何将旧式应用程序菜单转换为适用于现代 phones?它不必很花哨。

/** Setup menu */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return true;
}
/** Handle menu clicks */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle item selection
    switch (item.getItemId()) {
        case R.id.action_about:
            final SpannableString s = 
            new SpannableString(getApplicationContext().getText(R.string.about));
            Linkify.addLinks(s, Linkify.ALL);
            AlertDialog d = new AlertDialog.Builder(this)
            .setIcon(android.R.drawable.ic_dialog_info)
            .setTitle("About")
            .setMessage(s)
            //.setView(message)
            .show();
            ((TextView)d.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance());
            return true;
        default:
            new AlertDialog.Builder(this)
            .setIcon(android.R.drawable.ic_dialog_info)
            .setTitle("Currently not used.")
            .show();
            return super.onOptionsItemSelected(item);
    }
}

我承认几年前我不再理解上面的所有细节。它起作用了,所以我从来没有太在意过它。看起来有点罗嗦...可能有更简单的方法可以做到。

这是menu/main.xml

    <menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"/>
   <item
        android:id="@+id/action_about"
        android:orderInCategory="3"
        android:title="About"/>
    <item
        android:id="@+id/action_manual"
        android:orderInCategory="4"
        android:title="Manual"/>
    </menu>

也许有一些 "theme" 可以添加到某处,使菜单按钮显示在屏幕上的某处,仅此而已? (我知道我很乐观。:))

一切正常。

我认为你的问题是因为你正在扩展 Activity。

Activity 更改为 AppComatActivity

并将您的 appThem 更改为 android:theme="@style/Theme.AppCompat.Light.DarkActionBar"

注: 要使用 AppCompatActivity,请确保您已下载 Google 支持库(您可以在工具 -> Android -> SDK 管理器中查看)。然后只需在应用程序的 gradle.build 文件中包含 gradle 依赖项:

compile 'com.android.support:appcompat-v7:27.0.2'

解决方案:

我能找到的唯一解决方案是在最新的 Android Studio 中使用默认设置创建一个全新的项目。这给出了 "latest fashion" 设置。然后我手动从旧项目中移入代码。

现在一切正常!

问题/原因:

正如上面评论部分所述,我为使代码现代化所做的每一次尝试都导致了一大堆问题。这是一个古老的项目,早在 Android Studio 还未处于 Beta 阶段时就已经存在。因此,它基于 Eclipse。当时的 Android 版本是 Jelly Bean(Kitkat 刚刚发布)。

总而言之,我们有一个基于旧 IDE 的古老项目。也许将现代 Eclipse 项目转换为 Android Studio 是可行的。也许将旧的 AS 项目转换为现代项目是可行的。然而,同时完成这两个大跳跃对我来说挑战太大了。

另一个与旧代码无关但使问题非常混乱的问题是,目前出于某种原因,称为 AAPT2 的东西仅在 .gradle 目录的搜索路径中假定美国字符。我使用 "assumes" 这个词,因为如果字符是其他字符,您会在构建日志中看到错误页面。 None 的错误非常清楚地指出了原因。

据我所知,我什至不使用 AAPT2!经过几个不眠之夜,我通过更改 Android Studio 中的全局设置来简单地使用另一条路径解决了这个问题。