我的旧应用程序在主要活动上有一个简单的菜单。它只有几个简单的选项,例如"关于"导致弹出窗口显示有关应用程序的一些信息。
它完美适用于模拟器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;只是添加一个使菜单按钮出现在屏幕上某个地方的地方,那是什么? (我知道我很乐观。:))
答案 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中的全局设置来解决它,只需使用另一条路径。