创建自定义选择器
Create custom selector
我有 3 个 TextView
,我想创建一个自定义 selector
drawable
其中:
- 创建带圆角的矩形边框(完成)
- 当用户按下其中之一时被选中
TextView
s:
<LinearLayout android:id="@+id/info" android:layout_marginTop="68dp"
android:layout_width="wrap_content" android:layout_height="fill_parent"
android:layout_centerHorizontal="true"
android:orientation="horizontal">
<TextView android:id="@+id/tour1"
android:paddingLeft="10dp" android:paddingRight="10dp"
android:paddingTop="8dp" android:paddingBottom="8dp"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/back"
android:gravity="center"
android:text="Tour \n disponibili \n 21"/>
<TextView android:id="@+id/tour2" android:layout_toRightOf="@+id/tour1"
android:paddingLeft="10dp" android:paddingRight="10dp"
android:paddingTop="8dp" android:paddingBottom="8dp"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/back"
android:gravity="center"
android:text="Tour \n prenotabili \n 16"
android:layout_marginLeft="16dp"/>
<TextView android:id="@+id/tour3" android:layout_toRightOf="@+id/tour2"
android:paddingLeft="10dp" android:paddingRight="10dp"
android:paddingTop="8dp" android:paddingBottom="8dp"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/back"
android:gravity="center"
android:text="Tour \n preferiti \n 3"
android:layout_marginLeft="16dp"/>
</LinearLayout>
我的 Drawable
selector
文件,back.xml
:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle" >
<stroke android:width="1dip"
android:color="#4fa5d5"/>
<corners android:radius="7dp"/>
</shape>
</item>
<item android:state_pressed="true">
<shape android:shape="rectangle" >
<stroke android:width="5dip"
android:color="#ff0000"/>
<corners android:radius="7dip" />
</shape>
</item>
我想知道如何:
- 成功应用属性
"?android:attr/selectableItemBackground"
- 或者,正如我刚刚尝试的那样,应用一个自定义的。
不幸的是,我无法实现以上任何一项。在我的示例中,TextView
s 始终显示第一个项目(没有 android:state_pressed="true"
属性的项目),当我按下它们时,它们永远不会切换到具有 android:state_pressed="true"
属性的项目。
我的代码哪里有缺陷?
尝试调换这两项的顺序,我认为这很重要:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle" >
<stroke android:width="5dip"
android:color="#ff0000"/>
<corners android:radius="7dip" />
</shape>
</item>
<item>
<shape android:shape="rectangle" >
<stroke android:width="1dip"
android:color="#4fa5d5"/>
<corners android:radius="7dp"/>
</shape>
</item>
</selector>
编辑
事实上,您可能需要将项目的描述放在单独的文件中:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/pressed"/>
<item android:drawable="@drawable/unpressed"/>
</selector>
应用 roarster 的建议后,您必须使用 android:clickable="true"
使 TextView 可点击
选择器中项目的顺序很重要,因为选择器将选择第一个(从顶部开始)与视图状态匹配的项目,因此,"default" 状态(没有 android:state_* defined) 应该放在最后,否则它将始终匹配。
我有 3 个 TextView
,我想创建一个自定义 selector
drawable
其中:
- 创建带圆角的矩形边框(完成)
- 当用户按下其中之一时被选中
TextView
s:
<LinearLayout android:id="@+id/info" android:layout_marginTop="68dp"
android:layout_width="wrap_content" android:layout_height="fill_parent"
android:layout_centerHorizontal="true"
android:orientation="horizontal">
<TextView android:id="@+id/tour1"
android:paddingLeft="10dp" android:paddingRight="10dp"
android:paddingTop="8dp" android:paddingBottom="8dp"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/back"
android:gravity="center"
android:text="Tour \n disponibili \n 21"/>
<TextView android:id="@+id/tour2" android:layout_toRightOf="@+id/tour1"
android:paddingLeft="10dp" android:paddingRight="10dp"
android:paddingTop="8dp" android:paddingBottom="8dp"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/back"
android:gravity="center"
android:text="Tour \n prenotabili \n 16"
android:layout_marginLeft="16dp"/>
<TextView android:id="@+id/tour3" android:layout_toRightOf="@+id/tour2"
android:paddingLeft="10dp" android:paddingRight="10dp"
android:paddingTop="8dp" android:paddingBottom="8dp"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:background="@drawable/back"
android:gravity="center"
android:text="Tour \n preferiti \n 3"
android:layout_marginLeft="16dp"/>
</LinearLayout>
我的 Drawable
selector
文件,back.xml
:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle" >
<stroke android:width="1dip"
android:color="#4fa5d5"/>
<corners android:radius="7dp"/>
</shape>
</item>
<item android:state_pressed="true">
<shape android:shape="rectangle" >
<stroke android:width="5dip"
android:color="#ff0000"/>
<corners android:radius="7dip" />
</shape>
</item>
我想知道如何:
- 成功应用属性
"?android:attr/selectableItemBackground"
- 或者,正如我刚刚尝试的那样,应用一个自定义的。
不幸的是,我无法实现以上任何一项。在我的示例中,TextView
s 始终显示第一个项目(没有 android:state_pressed="true"
属性的项目),当我按下它们时,它们永远不会切换到具有 android:state_pressed="true"
属性的项目。
我的代码哪里有缺陷?
尝试调换这两项的顺序,我认为这很重要:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<shape android:shape="rectangle" >
<stroke android:width="5dip"
android:color="#ff0000"/>
<corners android:radius="7dip" />
</shape>
</item>
<item>
<shape android:shape="rectangle" >
<stroke android:width="1dip"
android:color="#4fa5d5"/>
<corners android:radius="7dp"/>
</shape>
</item>
</selector>
编辑
事实上,您可能需要将项目的描述放在单独的文件中:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/pressed"/>
<item android:drawable="@drawable/unpressed"/>
</selector>
应用 roarster 的建议后,您必须使用 android:clickable="true"
选择器中项目的顺序很重要,因为选择器将选择第一个(从顶部开始)与视图状态匹配的项目,因此,"default" 状态(没有 android:state_* defined) 应该放在最后,否则它将始终匹配。