android - 如何根据其状态设置 SearchView 的样式?

标签 android android-view android-drawable searchview android-styles

我正在尝试设置 SearchView 的样式,使其在用户聚焦时以不同方式显示,就像在亚马逊的应用程序中一样:

专注

SearchView, focused

不专心

SearchView, not focused

我从 this article 看到从 v21 开始,可以使用 styleable 属性来自定义 SearchView 的显示,例如 queryBackground:

<!-- Background for the section containing the search query -->
    <attr name="queryBackground" format="reference" />

我尝试通过我的应用样式为此属性设置一个drawable:

风格

<style name="AppTheme.SearchView" parent="Widget.AppCompat.SearchView">
    <item name="queryBackground">@drawable/shape_search</item>
</style>

可绘制

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="false">
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
               android:padding="12dp"
               android:shape="rectangle">
            <solid android:color="#FFF"/>
            <stroke
                android:width="0.3dp"
                android:color="@color/colorAccent"/>
            <corners android:radius="5dip"/>
            <padding android:bottom="0dip" android:left="0dip" android:right="0dip" android:top="0dip"/>
        </shape>
    </item>
    <item android:state_focused="true">
        <shape xmlns:android="http://schemas.android.com/apk/res/android"
               android:padding="12dp"
               android:shape="rectangle">
            <solid android:color="#FFF"/>
            <stroke
                android:width="3dp"
                android:color="@color/colorAccent"/>
            <corners android:radius="5dip"/>
            <padding android:bottom="0dip" android:left="0dip" android:right="0dip" android:top="0dip"/>
        </shape>
    </item>
</selector>

然而,这并不像预期的那样工作:第一种样式总是被选中,无论我是否关注 SearchView。 我尝试使用其他状态选择器,例如 state_active 或什至 state_window_focused,它提到了 当 View 的窗口具有输入焦点时,但在每种情况下聚焦 SearchView 都没有'改变它的显示。

有没有办法在这两种状态下以不同方式显示此 SearchView?

最佳答案

现在是 05/06/2018 我认为您已经找到了适合您的解决方案,但我认为我的回答可能对其他人有帮助 我用的是kotlin,你用java也是一样

在您的 View 中( Activity 、 fragment 、..):

 svSearch.setOnQueryTextFocusChangeListener(object : View.OnFocusChangeListener {
        override fun onFocusChange(v: View?, hasFocus: Boolean) {
            svSearch.isSelected =  hasFocus
            // isIconified() return true if search view lost focus, this line handle for user press back button case
            // as default when user press back button, the search view lost focus but view doesn't change state (collapse if width = wrap_content) 
            svSearch.isIconified = !hasFocus
        }

 })

选择器:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="false">
       // something 
    </item>
    <item android:state_selected="true">
       // something 
    </item>
</selector>

关于android - 如何根据其状态设置 SearchView 的样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39658868/

相关文章:

android - popBackStack 后 ViewPager 中的 fragment 不显示

android - 如何更改 Timepicker Style 轮?

android - 调用 getDrawingCache() 时 View 太大而无法放入绘图缓存

android - 在 ViewPager 的一半处反转绘制顺序

java - App,Uri为空,因为我的光标也为空

android - 需要使用 for 循环中使用的变量

java - Drawable V21、V24 与 hdpi、mdpi、xhdpi 等自定义文件夹。?我应该将图像放在哪个文件夹中以获得多设备支持?

android - XXXHDPI 设备不同分辨率的图像加载问题

android - 设备驱动程序 API 匹配错误

java - 如何在Java中动态地将一个波纹可绘制应用于多个按钮?