将旧式Android菜单转换为适用于较新的手机

时间:2018-02-05 03:08:37

标签: android menu backwards-compatibility

我的旧应用程序在主要活动上有一个简单的菜单。它只有几个简单的选项,例如"关于"导致弹出窗口显示有关应用程序的一些信息。

它完美适用于模拟器Nexus One(API23),因为它有一个模拟的物理菜单按钮。

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

我实际上依稀记得多年前在手机上运行它并没有菜单按钮,但不知何故仍然可以访问菜单。我可能记错了。

(几天前我开始深入研究这个问题,并开始修改我的代码,主要活动继承于比Activity更浪漫的东西,然后导致一些旧的API版本被遗漏 - 事情很快就失控了。经过几个小时的" maven gradle设置"和#34;支持图书馆"东西以及很多页面的" AAPT2错误"并弄乱我的整个系统试图修复它,我有抛弃所有东西并从回购中获得一个新的克隆。幸运的是,我还可以修复我对系统所做的其他更改。)

如何将旧式应用菜单转换为现代手机?它不一定要花哨。

/** 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>

也许有一些&#34;主题&#34;只是添加一个使菜单按钮出现在屏幕上某个地方的地方,那是什么? (我知道我很乐观。:))

2 个答案:

答案 0 :(得分:0)

一切都很好。

我认为您的问题是因为您正在扩展活动。

Activity更改为AppComatActivity

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

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

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

答案 1 :(得分:0)

解决方案:

我能找到的解决方案的唯一方法是在最新的Android Studio中使用默认设置创建一个全新的项目。这给了一个最新的时尚&#34;建立。然后我手动从旧项目中移入代码。

现在一切都很完美!

问题/原因:

正如上面评论部分所述,我为使代码现代化所做的每一次尝试都导致了一系列问题。这是一个古老的项目,从Android Studio甚至还未进入Beta阶段开始。因此,它基于Eclipse。当时的Android版本是Jelly Bean(Kitkat刚刚发布)。

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

与旧代码无关的另一个问题,但是这个问题非常困惑的是,AAPT2目前无论出于什么原因,只会在.gradle目录的搜索路径中假定美国字符。我使用&#34;假设&#34;这个词,因为如果字符是其他任何东西,你会在构建日志中得到错误页面。所有错误都没有明确指出原因。

AFAIK我甚至不使用AAPT2!在一些不眠之夜之后,我通过更改Android Studio中的全局设置来解决它,只需使用另一条路径。