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

时间:2016-09-23 10:46:10

标签: 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,当视图的窗口具有输入焦点时会提及,但在每种情况下都集中了SearchView没有&#39 ; t改变它的显示。

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

1 个答案:

答案 0 :(得分:1)

这是05/06/2018 我认为你找到了解决方案,但我认为我的回答可能对其他人有帮助 我使用kotlin,如果你使用java,它是相同的

在您的视图中(活动,片段,..):

 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>