【问题标题】:Why is the android.widget.SearchView not expanding on single click and instead moves the icon to left side?为什么 android.widget.SearchView 在单击时不展开,而是将图标移动到左侧?
【发布时间】:2020-10-05 04:06:39
【问题描述】:

我在MaterialToolbar 中使用android.widget.SearchView,并且还在菜单资源文件中设置了正确的属性。但是当我点击搜索图标时,它并没有展开。相反,搜索图标移动到左侧。再次单击它时,它会展开,但搜索图标仍会出现在 EditText 中。


布局文件

<com.google.android.material.appbar.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <com.google.android.material.appbar.MaterialToolbar
        android:id="@+id/toolbar"
        style="@style/Widget.MaterialComponents.Toolbar.Primary"
        android:layout_width="match_parent"
        android:layout_height="?actionBarSize"
        app:title="@string/app_name" />

</com.google.android.material.appbar.AppBarLayout>

菜单文件

<?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/action_search"
        android:title="@string/action_search"
        android:icon="@drawable/ic_search"
        app:showAsAction="ifRoom|collapseActionView"
        app:actionViewClass="android.widget.SearchView" />

</menu>


点击前

点击后

SearchView hint

【问题讨论】:

  • 尝试将androidx.appcompat.widget.SearchView 用于app:actionViewClass
  • @MikeM。使用 AppCompat 版本后,搜索视图完美展开。但扩展后,EditText 仍然有搜索图标,一旦我开始输入,它就会消失。此外,androidx.appcompat.widget.SearchView 的文档说只有在您想支持 API 7 时才应该使用它。如果您使用的是 API 11 或更高版本,请使用框架类。这就是我感到困惑的地方。
  • 嗯,我从来不知道这是SearchView 的记录建议。在这一点上,我不知道该告诉你什么。
  • 好的,我认为您将不得不使用动作布局来摆脱提示,因为它仅由 XML 属性设置。创建一个单独的布局文件,其中只有&lt;SearchView&gt;,宽度为match_parent,高度为wrap_content,键为app:searchHintIcon="@null"。然后将app:actionViewClass="android.widget.SearchView" 更改为app:actionLayout="@layout/your_search_view_layout"。让我知道会发生什么。
  • 我想我找到了答案。您能否详细说明这是对我帖子的回答,以便我可以将其标记为我的解决方案?

标签: android toolbar searchview


【解决方案1】:

虽然文档建议使用框架 SearchView,但我一直发现 support/androidx SearchView 与库组件配合得更好——例如,AppCompatActivityMaterialToolbar 等——尽管我'我不确定究竟是什么导致了这些小故障。事实上,在此处使用 androidx.appcompat.widget.SearchView 代替 android.widget.SearchView 代替 actionViewClass 在展开时摆脱了那个放错位置的搜索图标。

但是,SearchView 中的 AutoCompleteTextView 仍然有一个类似的搜索图标作为提示,因为它没有以正确的样式结束。我最初预计将Toolbar 设置为支持ActionBar 会将其与儿童的其他相关样式集成,但似乎SearchView 的样式由于某种原因通常设置为@987654333 @ 在&lt;*Toolbar&gt; 上充当ActionBar

尽管大多数消息来源似乎表明各种 ThemeOverlay.*.ActionBar 样式仅调整 colorControlNormal 属性,但他们实际上也将 searchViewStyle 设置为适当的 Widget.*.SearchView.ActionBar 值,因此我们添加适当的值非常重要覆盖。例如,为了保持更改为androidx 版本:

<com.google.android.material.appbar.MaterialToolbar
    android:id="@+id/toolbar"
    android:theme="@style/ThemeOverlay.MaterialComponents.Dark.ActionBar"
    ... />

这也可以通过将其设置为Activity 主题中的actionBarTheme 而起作用,但请注意它可以被&lt;*Toolbar&gt; 本身的属性覆盖,就像在给定的设置中一样style="@style/Widget.MaterialComponents.Toolbar.Primary".

如果您不使用材质组件,ThemeOverlay.AppCompat 样式也可用。如果你只使用平台类,在系统命名空间中可以使用类似的样式;例如,@android:style/ThemeOverlay.Material.Dark.ActionBar


此答案的初始修订版手动删除了该提示图标,因为当时我不知道给定设置究竟是如何失败的。现在不需要这样做,但如果您想进一步自定义,该示例只需将菜单 &lt;item&gt;app:actionViewClass 属性替换为指向此布局的 app:actionLayout

<androidx.appcompat.widget.SearchView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/search_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:searchHintIcon="@null" />

searchHintIcon 设置是此处示例所需的全部内容,但您可以设置任何适用的 SearchView 属性。

如果您要走这条路,最好设置style="@style/Widget.AppCompat.SearchView.ActionBar",其中包括searchHintIcon 设置,并确保SearchView 的整体风格正确,正如Artem Mostyaev 在下面的cmets 中所建议的那样。

【讨论】:

  • 您可以使用style="@style/Widget.AppCompat.SearchView.ActionBar" 而不是设置app:searchHintIcon="@null"
  • 这种风格也设置了其他几个属性值。此示例的最低要求是仅设置 searchHintIcon
  • 是的。但是该样式为您提供了实现原生 SearchView 样式的所有属性。我希望它对某人有用。
  • 啊,好的,我明白你的意思了。好点子。
  • 您的评论确实很有用。我不知道这种风格的存在,它让我意识到必须有一种“内置”的方式来做到这一点,而无需自定义布局。我已经编辑了答案,以防您使用此解决方案并想要更新。谢谢,干杯!
【解决方案2】:

上述方法对我不起作用。我不知道为什么,但尝试了这个并成功了。 通过 SearchView 参考搜索提示图标并将其可见性设置为 GONE:

ImageView icon = (ImageView) mSearchView.findViewById(androidx.appcompat.R.id.search_mag_icon);
icon.setVisibility(View.GONE);

然后添加这一行:

mSearchView.setIconified(false);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2015-09-17
    • 2016-09-16
    • 2020-03-12
    相关资源
    最近更新 更多