不使用appcompat库时应该使用android:showAsAction

时间:2014-11-12 15:01:01

标签: android eclipse android-actionbar android-appcompat

我有一个奇怪的问题,我在我的Android应用程序中使用了一个menu.xml文件,如下所示:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:compat="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/action_refresh"
        android:orderInCategory="100"
        android:title="@string/action_refresh"
        android:icon="@drawable/toc"
        compat:showAsAction="always"/>
</menu>

并且它运行良好,但是几天前我正在将我的eclipse更新到最后一个版本,之后,app:showAsAction =&#34; always&#34;显示错误:

  

不使用appcompat库时应该使用android:showAsAction   之后,我的操作栏图标被移动到溢出栏,而根本没有显示在操作栏中。

无论如何,appcompat库是我的基本样式的父级。 我该怎么做才能解决这个问题?

6 个答案:

答案 0 :(得分:18)

你需要做三件事 -

  1. 将这三件事xmlns:tools="schemas.android.com/tools" tools:context="com.example.sample.YourActivity" xmlns:yourapp="http://schemas.android.com/apk/res-auto"添加到您的<menu>代码

    以及通常的xmlns:android="http://schemas.android.com/apk/res/android"

  2. yourapp:showAsAction="ifRoom"添加到<item>

  3. 最后,通过Project清除您的项目 - &gt;清洁...

  4. 最后一步是为我解决了这个问题。简单地清理项目(有时它们会变脏)

    这是最终代码的样子:

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="schemas.android.com/tools"
    tools:context="com.example.sample.YourActivity"
    xmlns:yourapp="http://schemas.android.com/apk/res-auto" >
    
    <item
        android:id="@+id/action_share"
        android:orderInCategory="100"
        android:title="Share"
        android:icon="@drawable/ic_share_white"
        yourapp:showAsAction="ifRoom" />
    
    </menu>
    

答案 1 :(得分:14)

这适用于我,我使用了appcompatlibrary:

compat:showAsAction="always"

而不是:

app:showAsAction="always"

并使用compat:showAsAction =&#34; always&#34; , 里面的menu.xml包含以下行:

<menu   
   ......
  <!-- include the below line -->
    xmlns:compat="http://schemas.android.com/apk/res-auto" >

答案 2 :(得分:5)

面临同样的问题。这两个选项对我有用:

1.Including - xmlns:compat =“http://schemas.android.com/apk/res-auto”&gt;然后使用:“compat:showAsAction =”ifRoom“/&gt;”

2.不包括compat,只需使用:app:showAsAction =“ifRoom”/&gt;

PS:使用Android Studio。

答案 3 :(得分:1)

我在多模块Gradle项目中遇到了同样的问题。据Android Lint CLI报道。

问题的环境

我的模块如下:

My modules

feature_homeAppCompat模块,其菜单类似于:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/edit"
        android:icon="@drawable/ic_edit"
        android:title="@string/edit"
        app:showAsAction="always" />

</menu>

我想用一个./gradlew命令为整个应用程序运行Android Lint,所以我在app/build.gradle上添加了以下lint选项:

lintOptions {
    checkDependencies true
}

然后,当我运行./gradlew :feature_home:lint时,一切都很好,但是当我尝试通过./gradlew :app:lint检查所有模块时,遇到了主题问题:Error: Should use android:showAsAction when not using the appcompat library


解决方案

问题是由于我的app模块不是AppCompat引起的。因此,将AppCompat依赖项添加到app/build.gradle可以解决此问题:

implementation "androidx.appcompat:appcompat:$appcompat_version"

答案 4 :(得分:0)

不使用appcompat库时应该使用android:showAsAction

问题:确保菜单项使用正确的命名空间 Id:AppCompatResource

使用appcompat库时,菜单资源应该引用app:namespace中的showAsAction,而不是android:namespace。

同样,当不使用appcompat库时,你应该使用android:showAsAction属性。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   xmlns:compat="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/action_refresh"
        android:orderInCategory="100"
        android:title="@string/action_refresh"
        android:icon="@drawable/toc"
        tools:ignore="AppCompatResource"
        compat:showAsAction="always"/> 
</menu>

答案 5 :(得分:0)

您需要做的就是将以下行添加到item元素以取消警告。将名称空间设为compat vs app "http://schemas.android.com/apk/res-auto"实际上并没有做任何特别的事情。

tools:ignore="AppCompatResource"

完整代码:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:compat="http://schemas.android.com/apk/res-auto" >

    <item
        android:id="@+id/action_refresh"
        android:orderInCategory="100"
        android:title="@string/action_refresh"
        android:icon="@drawable/toc"
        tools:ignore="AppCompatResource"
        compat:showAsAction="always"/>
</menu>

注意:compat标记可以是app或您想要的任何内容。