【问题标题】:How do I properly display search icon in Activity?如何在 Activity 中正确显示搜索图标?
【发布时间】:2015-04-12 17:42:35
【问题描述】:

我创建了一个小型测试应用来练习在普通 Activity(不是 ActionBarActivity)中设置操作栏,因为我只计划使用 API 级别 15 及更高级别。我想在操作栏上显示搜索图标。如果我像这样设置 menu_main.xml 文件,我可以显示搜索图标,但并非没有错误:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  xmlns:tools="http://schemas.android.com/tools"
  tools:context=".MainActivity">
<item android:id="@+id/action_search"
      android:icon="@drawable/ic_action_search"
      android:title="@string/action_search"
      android:showAsAction="ifRoom"/>
</menu>

我可以让应用程序在我的模拟器中正常运行并显示图标,但在 Android Studio 中弹出错误:

"当使用 appcompat 库时,菜单资源应该引用 app: 命名空间中的 showAsAction,而不是 android: 命名空间。同样,当不使用 appcompat 库时,您应该使用 android:showAsAction 属性。"

我可以通过从 build.gradle 文件中删除以下行来消除错误:

compile 'com.android.support:appcompat-v7:22.0.0'

但是,删除支持库似乎不是一个好主意(尽管我在这里可能错了)。如果我使用错误推荐的 app:namespace 方法,我可以摆脱错误,但是搜索图标不会出现在操作栏上;相反,搜索选项出现在溢出菜单中。如何正确显示搜索图标而不会出现错误且不删除支持库?我只是忽略错误吗?我是否应该坚持为我的应用程序使用 ActionBarActivity(即,是否有理由尝试使用带有操作栏的普通 Activity 或者我在浪费时间)?我正在为这个项目使用 Android Studio。

【问题讨论】:

    标签: android android-activity android-actionbar searchview


    【解决方案1】:

    首先,确保您使用的是基于 v7 库主题的应用主题。

    <resources>
    
        <!-- Application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light">
    

    而你使用ActionBarActivity。 Appcompat 的存在不仅是为了向后兼容,而且还弥补了最新材料 UI 的一些差距。

    menu.xml文件中,你需要使用app命名空间:

    <?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"
          xmlns:tools="http://schemas.android.com/tools"
          tools:ignore="AlwaysShowAction"
        >
        <item
            android:id="@+id/menu_search"
            android:menuCategory="system"
            android:icon="@drawable/ic_action_search"
            android:title="@string/search"
            app:showAsAction="always"
            />
    </menu>
    

    注意

    xmlns:app="http://schemas.android.com/apk/res-auto"
    

    app:showAsAction="always" 
    

    它不使用android: 命名空间,而是使用 v7 库资源命名空间。

    另外,android:showAsAction="ifRoom" 不保证 android 会一直显示图标。

    【讨论】:

    • 当我这样做时,图标不会出现;相反,搜索选项显示在溢出菜单中。澄清一下,该应用程序将在具有 android 命名空间的模拟器上运行,但该特定行在编辑器中以红色下划线显示,就好像有错误一样。删除支持库会消除错误,但该站点上的其他帖子似乎建议保留该库,所以我宁愿不必这样做。
    • @jhonkaman 您是否根据 v7 库设置了应用主题? stackoverflow.com/a/17440170/1531054
    • 在我的 styles.xml 文件中,父属性设置为 parent="android:Theme.Holo.Light"
    • 将其设置为“Theme.AppCompat.Light”甚至“Theme.AppCompat.Light.DarkActionBar”会出于某种原因完全摆脱操作栏。我认为这是因为它只是一个普通的 Activity 而不是 ActionBarActivity。
    • @jhonkaman ActionbarActivity + Appcompat.Theme + v7 库。你需要这三个才能工作。或者一起删除 v7 库。
    【解决方案2】:

    尝试改变

    android:showAsAction="ifRoom" 
    

    app:showAsAction="ifRoom"
    

    【讨论】:

    • 当我这样做时,图标不会出现;相反,搜索选项显示在溢出菜单中。此外,根据documentation,app 命名空间仅用于兼容低至 Android 2.1 的版本。但是,我的最低 SDK 是 Android 4.0.3,所以我觉得我应该能够使用 android 命名空间。
    • 你在 onCreateOptionsMenu() 中添加了其他图标吗?当您设置为始终时,它是否仍然出现在溢出中。即 app:showAsAction="always"
    • 溢出菜单中有一个设置选项,但没有其他图标。从 menu_main.xml 文件中删除设置项并没有修复它。将其设置为 app"showAsAction="always" 也无法解决问题。
    • 抱歉不太清楚这里发生了什么,总是和 ActionBarActivity 一起使用。
    • 这似乎是正确的做法。从现在开始,我可能也只会使用 ActionBarActivity。
    【解决方案3】:

    实际上我三天前遇到了同样的问题,一直在尝试在网上找到的许多解决方案,但直到现在都没有奏效。通过遵循前面的 cmets,我所做的一切使它对我有用的东西都粘贴在下面,希望它有效。

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
            app:showAsAction="always"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <!-- Search / will display always -->
    <item android:id="@+id/action_search"
        android:icon="@drawable/ic_action_search"
        android:title="@string/action_search"
        app:showAsAction="always"/>
    </menu>
    
    <resources>
    
        <!-- Base application theme. -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        </style>
    
    </resources>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-04
      • 1970-01-01
      • 2013-03-29
      • 2022-01-25
      • 2016-10-06
      • 2014-12-04
      • 2021-07-07
      • 2017-02-19
      相关资源
      最近更新 更多