1
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/parent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/transparent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <LinearLayout
        android:layout_width="0px"
        android:layout_height="0px"
        android:focusable="true"
        android:focusableInTouchMode="true" />

    <AutoCompleteTextView
        android:id="@+id/autoComplete"
        android:layout_width="fill_parent"
        android:layout_height="48dp"
        android:background="@drawable/black_rounded_borders" />

</RelativeLayout>

我添加了无用的 LinearLayout 只是为了避免在启动 Activity 时初始关注 AutoCompleteTextView

可绘制/black_rounded_borders.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle" >

    <solid android:color="#FFFFFFFF" />

    <stroke
        android:width="2dp"
        android:color="@color/selector_black_border" />


    <corners
        android:bottomLeftRadius="5dp"
        android:bottomRightRadius="5dp"
        android:topLeftRadius="5dp"
        android:topRightRadius="5dp" />

</shape>

颜色/selector_black_border.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_focused="true" android:color="#FF269ff5"/>
    <item android:state_pressed="true" android:color="#FF269ff5"/>
    <item android:state_selected="true" android:color="#FF269ff5"/>
    <item android:state_focused="false" android:color="#FF000000"/>
    <item android:state_pressed="false" android:color="#FF000000"/>
    <item android:state_selected="false" android:color="#FF000000"/>

</selector>

活动

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    autoComplete = (AutoCompleteTextView) findViewById(R.id.autoComplete);
    Log.d("hasFocus", autoComplete.hasFocus() + "");
    Log.d("isSelected", autoComplete.isSelected() + "");
    Log.d("isPressed", autoComplete.isPressed() + "");
    //All the above are false
}

尽管与蓝色(#FF269ff5)颜色相关的所有状态都是错误的。我仍然得到蓝色的边框。此外,如果我更改color/selector_black_border.xml文件中的状态顺序,比如先全部为假,然后为真,那么我会得到黑色边框。它就像只有第一种颜色有效。

我错过了什么?

谢谢你。

4

1 回答 1

2

我不能把它放在评论中,因为它太大了,但我在这里找到了一个解释,其中指出:

AColorStateList不能作为<solid>XML 定义中的属性传递,或者实际上是 a 的任何属性<shape>。该属性作为 Color 资源从 XML 中扩展出来,然后传递给 Drawable 的setColor()方法,该方法只接受一个 ARGB 值。

只有一种类型的 Drawable 实例旨在包含和呈现基于状态的多个项目,StateListDrawable<selector>. 所有其他 Drawable 实例都只是该集合的成员或独立绘制。

另请注意,膨胀的<shape>项目实际上是 aGradientDrawable而不是 a ShapeDrawable。如果您查看源代码中inflate()的方法,您可以获得有关如何使用每个属性的所有详细信息。GradientDrawable

学分去@Devunwired。

但是,基于此,您可以创建不同的形状(每次都是一个矩形),每个形状都具有以下属性。使用下面的代码drawable/black_rounded_borders.xml,看看它是否按预期工作:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item>
        <selector xmlns:android="http://schemas.android.com/apk/res/android" >
            <item android:state_pressed="true">
                <shape android:shape="rectangle" >
                    <solid android:color="#FFFFFFFF" />

                    <stroke
                        android:width="2dp"
                        android:color="#FF269ff5" />

                    <corners
                        android:bottomLeftRadius="5dp"
                        android:bottomRightRadius="5dp"
                        android:topLeftRadius="5dp"
                        android:topRightRadius="5dp" />
                </shape>
            </item>
            <item android:state_focused="true">
                <shape android:shape="rectangle" >
                    <solid android:color="#FFFFFFFF" />

                    <stroke
                        android:width="2dp"
                        android:color="#FF269ff5" />

                    <corners
                        android:bottomLeftRadius="5dp"
                        android:bottomRightRadius="5dp"
                        android:topLeftRadius="5dp"
                        android:topRightRadius="5dp" />
                </shape>
            </item>
            <item android:state_selected="true">
                <shape android:shape="rectangle" >
                    <solid android:color="#FFFFFFFF" />

                    <stroke
                        android:width="2dp"
                        android:color="#FF269ff5" />

                    <corners
                        android:bottomLeftRadius="5dp"
                        android:bottomRightRadius="5dp"
                        android:topLeftRadius="5dp"
                        android:topRightRadius="5dp" />
                </shape>
            </item>
            <item>
                <shape android:shape="rectangle" >
                    <solid android:color="#FFFFFFFF" />

                    <stroke
                        android:width="1dp"
                        android:color="#FF000000" />

                    <corners
                        android:bottomLeftRadius="5dp"
                        android:bottomRightRadius="5dp"
                        android:topLeftRadius="5dp"
                        android:topRightRadius="5dp" />
                </shape>
            </item>
        </selector>
    </item>

</layer-list>

很抱歉这篇文章很长,而且我不知道它是否有效,但我找不到另一种发布方式。

于 2013-07-22T14:32:54.717 回答