带app的项目:showAsAction未显示

ITu*_*nko 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>
Run Code Online (Sandbox Code Playgroud)

工作完美,但适当和兼容的版本

<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>
Run Code Online (Sandbox Code Playgroud)

根本没有显示我的图标.

我正在测试Samsung GT P5210(android v.4.4.2)和Nexus 7(4.4.4)

mar*_*812 56

当你想使用操作栏时,你应该经常检查的事情是

1)延伸ActionBarActivity而不是Activity

public class MainMenu extends ActionBarActivity{

2)根据清单中的定义选择正确的样式

表现

<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
Run Code Online (Sandbox Code Playgroud)

样式

    <style name="AppTheme"
    parent="Theme.AppCompat.Light.DarkActionBar">
    </style>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

这是大多数人都错了

4)定义你MenuActivity

@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);
}
Run Code Online (Sandbox Code Playgroud)

如果您执行以下所有操作,则应该可以使用操作栏.

然后你应该onClickListener为每个位置添加...

  • 非常感谢您的详细解答.在我的项目中错误的父主题(android:Theme.Holo.Light而不是Theme.AppCompat.Light)和Activity正在扩展基本的Avtivity(而不是ActionBarActivity).现在它工作正常. (2认同)

bla*_*izz 16

我只是重新阅读你的问题,看到你的问题完全相反(但我的旧答案的一些部分仍然适用于你的问题),所以这里是更新的答案:

更新:

您已经在gradle文件中导入了appcompat库,但您似乎只支持比Level Level 11或14更新的设备?如果是这种情况,lint检查会发现您已经通过gradle导入了appcompat库,它认为您应该使用ActionBarActivity因为您的库导入.这就是你得到错误的原因.但是,当您的android:showAsAction属性正常工作时,您使用本机Activity和本机属性调用是正确的,即使lint检查说它是错误的.所以,如果你想去除棉绒的错误,你必须从你的gradle这个文件中删除程序兼容性lib和可能改变你的活动主题,以原生Holo浅色主题,为您的当前主题可能依靠程序兼容性主题.

它不使用app命名空间的答案是在本机分别为库代码的XML属性加载中,这在旧答案中处理.

老答案

如果您使用ActionBarActivity支持库中的设备来访问低于API级别11的设备,那么这里的主要问题是,ActionBarActivity重新创建一些本机Android XML属性,例如android:showAsAction在您自己的范围内,您可以使用以下内容定义:

xmlns:app="http://schemas.android.com/apk/res-auto"
Run Code Online (Sandbox Code Playgroud)

然后showAsActionapp:命名空间中使用相同的属性(此处)访问它们.因此,ActionBarActivity无法查看或访问本机android:showAsAction属性,因为它只在app命名空间而不是android命名空间中查找它.

如果要使用本机属性,则必须使用Activity具有Holo主题的本机,仅支持API Level 11及更高版本.


Mil*_*nNz 5

补充一下:

yourapp:showAsAction="ifRoom"
Run Code Online (Sandbox Code Playgroud)

或者

android:showAsAction
Run Code Online (Sandbox Code Playgroud)

例如:

<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>
Run Code Online (Sandbox Code Playgroud)

并在活动中:

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里阅读更多