带app的项目:showAsAction未显示

时间:2014-10-15 07:55:30

标签: android android-menu

我无法理解为什么错误和不兼容(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)

3 个答案:

答案 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