【问题标题】:Should use android:showAsAction when not using the appcompat library不使用 appcompat 库时应使用 android:showAsAction
【发布时间】:2014-11-12 15:01:01
【问题描述】:

我有一个奇怪的问题,我在我的 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="always" 显示错误:

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

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

【问题讨论】:

    标签: android eclipse android-actionbar android-appcompat


    【解决方案1】:

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

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

    使用 appcompat 库时,菜单资源应引用 app: 命名空间中的 showAsAction,而不是 android: 命名空间。

    同样,当不使用 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>
    

    【讨论】:

      【解决方案2】:

      你需要做三件事-

      1. 将这 3 个东西 xmlns:tools="schemas.android.com/tools" tools:context="com.example.sample.YourActivity" xmlns:yourapp="http://schemas.android.com/apk/res-auto" 添加到您的 &lt;menu&gt; 标签中

        连同通常的xmlns:android="http://schemas.android.com/apk/res/android"

      2. yourapp:showAsAction="ifRoom" 添加到您的&lt;item&gt;

      3. 最后,通过 Project -> Clean...清理您的项目...

      最后一步为我解决了这个问题。只需清理项目(它们有时会变得很脏)

      这是最终代码的样子:

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

      【讨论】:

      • 我发现删除错误所需要做的就是 Project/Clea/myProjName。但是,如果我再次编辑 xml,则会返回错误,所以我必须重新清理。
      • 使用xmlns:tools="http://schemas.android.com/tools" 而不是xmlns:tools="schemas.android.com/tools"
      【解决方案3】:

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

      问题的环境

      我的模块如下所示:

      feature_home 是一个AppCompat 模块,它的菜单如下:

      <?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,因此我将以下 lint 选项添加到 app/build.gradle

      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】:

        您需要做的就是将以下行添加到您的item 元素以禁止显示警告。将命名空间设置为 compatapp"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 或任何你想要的。

        【讨论】:

          【解决方案5】:

          这对我有用,我使用过 appcompatlibrary:

          compat:showAsAction="always"
          

          代替:

          app:showAsAction="always"
          

          并使用 compat:showAsAction="always" , 在 menu.xml 中包含以下行:

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

          【讨论】:

          • 谢谢,但不是答案,compat 对我来说是一个无法识别的命名空间
          • menu.xml 文件必须包含... schemas.android.com/apk/res/android" xmlns:tools="schemas.android.com/tools" xmlns:compat="schemas.android.com/apk/res-auto" >
          • 同样的错误:不使用 appcompat 库时应该使用 android:showAsAction,这让我很困惑,我已经删除了很多文档,并且所有文档都在谈论添加 MyApp 命名空间,但它不适合我
          • 显示完整的 menu.xml,您是仅使用 ActionBarActivity 还是 ActionBar?
          • schemas.android.com/apk/res/android" xmlns:compat="schemas.android.com/apk/res-auto" >
          【解决方案6】:

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

          1.Including - xmlns:compat="http://schemas.android.com/apk/res-auto" > 然后使用:"compat:showAsAction="ifRoom"/>"

          2.不包括compat,直接使用:app:showAsAction="ifRoom"/>

          PS:使用 Android Studio。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-02-25
            • 1970-01-01
            • 1970-01-01
            • 2016-05-05
            • 2019-02-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多