TextView의 배경색 선택기 할 때 Android 위젯의 배경색을 변경하려고 합니다.

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의 속성 TextViewtrue관심의 경우.

이 선택기를 TextViewas에 할당하면 android:background="@color/selector"런타임에 다음 예외가 발생합니다.

ERROR / AndroidRuntime (13130) : 원인 : org.xmlpull.v1.XmlPullParserException : 바이너리 XML 파일 줄 # 6 : 태그에는 드로어 블을 정의하는 ‘drawable’속성 또는 하위 태그가 필요합니다.

속성을 드로어 블로 변경하면 작동하지만 ID가 색상 참조 대신 이미지 참조로 해석되는 것처럼 보이기 때문에 결과가 완전히 잘못 보입니다 ( “드로어 블”에서 알 수 있듯이).

나를 혼란스럽게하는 것은 “@ color / black”과 같은 색상 참조를 배경 속성으로 직접 설정할 수 있다는 것입니다. 이것은 예상대로 작동합니다. 선택기를 사용하면 작동하지 않습니다.

선택기를 textColor문제없이 사용할 수도 있습니다 .

TextViewAndroid에서 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가 이미지 리소스를 그린 이유는 아마도 그가 여전히 컬러 디렉토리에있는 리소스를 참조하려고했지만 사용하여 @drawableID 충돌이 발생하여 잘못된 리소스를 선택 했기 때문일 것입니다 .

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"


답변