TextView
사용자가 터치 할 때 Android 위젯의 배경색을 변경하려고 합니다. 나는 그 목적을 위해 선택기를 만들었는데, 저장되어 res/color/selector.xml
있고 대략 다음과 같습니다.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:color="@color/semitransparent_white"
/>
<item
android:color="@color/transparent"
/>
</selector>
clickable
의 속성 TextView
인 true
관심의 경우.
이 선택기를 TextView
as에 할당하면 android:background="@color/selector"
런타임에 다음 예외가 발생합니다.
ERROR / AndroidRuntime (13130) : 원인 : org.xmlpull.v1.XmlPullParserException : 바이너리 XML 파일 줄 # 6 : 태그에는 드로어 블을 정의하는 ‘drawable’속성 또는 하위 태그가 필요합니다.
속성을 드로어 블로 변경하면 작동하지만 ID가 색상 참조 대신 이미지 참조로 해석되는 것처럼 보이기 때문에 결과가 완전히 잘못 보입니다 ( “드로어 블”에서 알 수 있듯이).
나를 혼란스럽게하는 것은 “@ color / black”과 같은 색상 참조를 배경 속성으로 직접 설정할 수 있다는 것입니다. 이것은 예상대로 작동합니다. 선택기를 사용하면 작동하지 않습니다.
선택기를 textColor
문제없이 사용할 수도 있습니다 .
TextView
Android에서 background-color-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/selected_state" />
</selector>
또한 해당 리소스를 drawable
색상 선택기 자체가 아니기 때문에 더 이해하기 쉬운 디렉토리 로 이동해야합니다 .
그런 다음 다음 res/drawable/selected_state.xml
과 같은 파일 을 만들어야합니다 .
<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/semitransparent_white" />
</shape>
마지막으로 다음과 같이 사용합니다.
android:background="@drawable/selector"
참고 : OP가 이미지 리소스를 그린 이유는 아마도 그가 여전히 컬러 디렉토리에있는 리소스를 참조하려고했지만 사용하여 @drawable
ID 충돌이 발생하여 잘못된 리소스를 선택 했기 때문일 것입니다 .
OP가 지금까지 문제를 해결 했더라도 이것이 여전히 누군가를 도울 수 있기를 바랍니다.
답변
Benoit의 솔루션은 작동하지만 실제로 모양을 그리는 데 오버 헤드가 발생하지 않아도됩니다. 색상은 드로어 블이 될 수 있으므로 /res/values/colors.xml 파일에서 색상을 정의하기 만하면됩니다.
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="semitransparent_white">#77ffffff</color>
</resources>
그런 다음 선택기에서 다음과 같이 사용하십시오.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:state_pressed="true"
android:drawable="@color/semitransparent_white" />
</selector>
답변
위의 더 간단한 솔루션 :
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<color android:color="@color/semitransparent_white" />
</item>
<item>
<color android:color="@color/transparent" />
</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="@color/dim_orange_btn_pressed" />
<item android:state_focused="true" android:drawable="@color/dim_orange_btn_pressed" />
<item android:drawable="@android:color/white" />
</selector>
android:drawable
각 항목에 속성을 추가 했는데 그 값은 색상입니다.
그건 그렇고, 왜 그들은 그것이 color
의 속성 중 하나 라고 말 selector
합니까? 그들은 android:drawable
필요한 것을 쓰지 않습니다 .
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:color="hex_color"
android:state_pressed=["true" | "false"]
android:state_focused=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_window_focused=["true" | "false"] />
</selector>
답변
배경 섹터를 만들지 않고 검색하는 사람은 해당 줄을 TextView
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
또한 선택 가능한 용도로 사용하려면 :
android:textIsSelectable="true"