android - 为什么 android.widget.SearchView 在单击时不展开,而是将图标移动到左侧?

标签 android toolbar searchview

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


点击之前

Before clicking

点击后

After clicking

SearchView hint

最佳答案

尽管文档建议使用框架 SearchView ,我一直发现support/androidx SearchView与库组件配合得更好 – 例如 AppCompatActivity , MaterialToolbar等等——尽管我不确定到底是什么导致了这些小故障。事实上,使用 androidx.appcompat.widget.SearchView此处代替 android.widget.SearchView对于actionViewClass在扩展时摆脱了错误放置的搜索图标。

但是,AutoCompleteTextView里面SearchView仍然有一个类似的搜索图标作为提示,因为它最终没有得到正确的样式。我最初期望设置 Toolbar作为支持ActionBar本来可以将其与 children 的其他相关风格整合起来,但似乎 SearchView由于某种原因, 的样式通常设置为 ThemeOverlay.*.ActionBar关于<*Toolbar>作为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"
    ... />

这也可以通过将其设置为 actionBarTheme 来实现。在你的Activity的主题,但请注意它可以被 <*Toolbar> 上的属性覆盖。本身,就像 style="@style/Widget.MaterialComponents.Toolbar.Primary" 给定的设置一样.

如果您不使用 Material Components,ThemeOverlay.AppCompat款式也可供选择。如果您仅使用平台类,则系统命名空间中也提供类似的样式;例如,@android:style/ThemeOverlay.Material.Dark.ActionBar .


此答案的初始修订手动删除了该提示图标,因为当时我不知道给定的设置到底是如何失败的。现在不需要这样做,但如果您想进一步自定义它,该示例只需替换菜单 <item>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 在下面的评论中所建议的。

关于android - 为什么 android.widget.SearchView 在单击时不展开,而是将图标移动到左侧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62393410/

相关文章:

android - Google Play Console App Rejection APK 需要有效的隐私政策和重要的披露

java - 在任何地方获取 ApplicationContext 的技术

objective-c - 侧边栏图标、工具栏图标和上下文菜单的 FinderSync 问题

android - 自定义 SearchView 在 android 中整个可点击

android - 在 Activity 中使用单个 SearchView,用于不同的 fragment

android - Cordova Android 不会显示 StatusBar

android - 如何检查 VideoView 是否包含视频?

java - 如何折叠主 fragment 工具栏和主工具栏?

javascript - 如何像在 Wysiwyg 中一样在 Quill 中添加 "show html"按钮?

android - 为 SearchView 设置 setOnQueryTextListener 会给出空指针异常