我无法理解为什么错误和不兼容(AndroidStudio告诉我“应该使用app:showAsAction与appcompat库)代码
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item android:id="@+id/action_search"
android:title="@string/action_search"
android:icon="@drawable/search"
android:showAsAction="always" />
</menu>
工作完美,但适当且兼容的版本如
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" >
<item android:id="@+id/action_search"
android:title="@string/action_search"
android:icon="@drawable/search"
app:showAsAction="always" />
</menu>
根本没有显示我的图标。
我正在测试Samsung GT P5210(android v.4.4.2)和Nexus 7(4.4.4)
答案 0 :(得分:57)
当您想要使用操作栏时应始终检查的事项是
1)扩展ActionBarActivity
而不是Activity
public class MainMenu extends ActionBarActivity{
2)按照清单
中的定义选择正确的样式<强>清单强>
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<强>风格强>
<style name="AppTheme"
parent="Theme.AppCompat.Light.DarkActionBar">
</style>
3)为showAsAction
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:**yourapp**="http://schemas.android.com/apk/res-auto" >
<item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
**yourapp**:showAsAction="ifRoom" />
...
</menu>
这是大多数人出错的原因
4)在Menu
Activity
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_activity_actions, menu);
return super.onCreateOptionsMenu(menu);
}
如果您执行以下所有操作,则操作栏应该有效。
然后你应该为每个位置添加onClickListener
...
答案 1 :(得分:16)
我只是重新阅读你的问题并看到你的问题完全相反(但我的旧答案的一些部分仍然适用于你的问题),所以这里有更新的答案:
您已在gradle文件中导入了appcompat库,但您似乎只支持比Level Level 11或14更新的设备?如果是这种情况,lint检查会发现您已通过gradle导入appcompat库,并且由于您的库导入,它认为您应该使用ActionBarActivity
。这就是你得到错误的原因。但是,当您的android:showAsAction
属性正常工作时,您正在使用本机Activity
并且本机属性调用是正确的,即使lint检查表明它是错误的。因此,如果要删除lint错误,则必须从gradle文件中删除appcompat lib,并将活动主题更改为本机Holo Light主题,因为您当前的主题可能依赖于appcompat主题。
为什么它不使用app
命名空间的答案是在本地分别为库代码的XML属性加载中,这在旧答案中处理。
如果您使用支持库中的ActionBarActivity
来访问低于API级别11的设备,则主要问题是,ActionBarActivity
会重新创建一些原生Android XML属性,例如{ {1}}在其自己的范围内,您使用以下内容定义:
android:showAsAction
然后使用xmlns:app="http://schemas.android.com/apk/res-auto"
命名空间中的相同属性(此处为showAsAction
)访问它们。
因此,ActionBarActivity无法查看或访问本机app:
属性,因为它只在android:showAsAction
命名空间而不是app
命名空间中查找它。
如果要使用本机属性,则必须使用具有Holo主题的本机android
,仅支持API级别11及更高版本。
答案 2 :(得分:4)
addthis:
yourapp:showAsAction="ifRoom"
或强>
android:showAsAction
例如:
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
<item android:id="@+id/action_search"
android:icon="@drawable/ic_action_search"
android:title="@string/action_search"
yourapp:showAsAction="ifRoom" />
</menu>
和活动:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu items for use in the action bar
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main_activity_actions, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle presses on the action bar items
switch (item.getItemId()) {
case R.id.action_search:
openSearch();
return true;
case R.id.action_compose:
composeMessage();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
阅读更多 here