TextView의 배경색 선택기


121

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를 적용하는 올바른 방법은 무엇입니까 ?


색상은 드로어 블로 해석 될 수 있습니다. 결과가 정확히 어떻게 잘못 되었습니까?
Romain Guy

색상이 아니라 드로어 블 리소스의 이미지를 배경으로 대신 표시합니다.
digitalbreed

2
위의 내용은 android : color가 아닌 android : drawable을 사용하는 경우 작동합니다. 적어도이 경우에는 android : drawable = "@ color / my_custom_color"가 작동합니다. 내 색상은 values ​​/ colors.xml에 정의되어 있습니다.
AgentKnopf

답변:


226

여기서 문제는 색상 선택기를 사용하여 배경색을 정의 할 수 없으며 드로어 블 선택기 가 필요하다는 것 입니다. 따라서 필요한 변경 사항은 다음과 같습니다.

<?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가 지금까지 문제를 해결 했더라도 이것이 여전히 누군가를 도울 수 있기를 바랍니다.


1
고마워, Benoit. 문제가 해결되었고 (정확히 내가 정확히 어떻게했는지 기억이 나지 않습니다) 프로젝트가 성공적으로 완료되었습니다. 나는 당신이 미래에 같은 문제를 겪는 사람들을 게시하고 돕기 위해 여기로 돌아와서 감사합니다.
digitalbreed 2011 년

나는이 일을 할 수 없다. 버튼에 적용하려고하는데 배경을 선택기의 기본 색상으로 설정했지만 state_pressed에 정의 된 모양으로 변경되지 않습니다. 무엇을 놓칠 수 있습니까? 당신이 저를 올바른 방향으로 안내 할 수 있다면 새로운 질문을 열 수도 있습니다.
Maragues 2011

@Maragues 코드를 보지 않고는 말하기가 어렵습니다. 새 질문을 열고 관련 코드를 게시하여 무엇이 잘못되었는지 파악하는 것이 좋습니다. 새 게시물에 대한 링크와 함께이 게시물에 댓글을 추가 할 수도 있습니다.
Benoit Martin

9
대신 선택기 항목에서 "drawable ="@ color / your_color "를 직접 사용하지 않는 이유는 무엇입니까? 모양이나 다른 파일을 정의 할 필요가 없습니다. 값 /colors.xml에 색상 정의 만 있으면됩니다 (항상 좋습니다). 되지 않음) 하드 코드의 색.
javaxian

작동하지 않는. 내가 모양 XML에서 선언 한 것과 다른 색상을 보여줍니다.
Er. Rohit Sharma

121

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>

어떤 이유로 귀하의 솔루션은 색상이 아닌 내 드로어 블 리소스 폴더의 임의 이미지를 표시합니다. 나는 정말 이상해 보이는 것처럼 프로젝트 / 수정 속성 / 재 저장 / 다시 열기 이클립스를 청소하려고했지만 소용이 없었습니다. 기묘한.
Yahel 2015 년

@Yahel 색상 드로어 블 리소스의 이름을 실제 드로어 블 파일과 동일하게 지정할 수 있습니까?
Jona

@Jona : 아니요,하지만 드로어 블의 이름은 background_application이고 컬러 드로어 블의 이름은 background_white_transparent입니다. 둘 다 그들에 대한 배경 지식이있었습니다 ... 다른 스레드에서 다른 스레드에서 동일한 일이 발생하는 것을 보았으므로 수많은 Android 버그 중 하나로 제출하고 전체 레이아웃을 수정하여 해결했습니다.
Yahel

@Yahel 음 ... 글쎄요, 그 문제는 보이지만 제 경우에는 같은 파일 이름이 아닙니다 ... 여기에서 질문을 확인하세요. stackoverflow.com/questions/9004744/…
Jona

제대로 작동하지 않았고 Benoit Martin의 대답은 잘 작동했습니다.
Emmanuel Touzery 2012

83

위의 더 간단한 솔루션 :

<?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>

드로어 블 폴더에 저장하면됩니다.


1
작동하지만 공식적으로는 지원되지 않습니다 (Android Studio에서 오류로 처리).
Blackhex 2013 년

@Blackhex 이상합니다. Eclipse에서 잘 작동합니다. 아마도 Lint 오류 일 수 있으며, 그렇다면 비활성화하거나 무시할 수 있습니다.
Jason Robinson

6
이것이 제가 해결책으로 생각하는 것입니다.
Lay González 2014

<item android:state_pressed="true" android:color="@color/vantablack"/>에 의미 동일하게 보이는<item android:state_pressed="true"><color android:color="@color/vantablack"/></item>
samis

16

이것도 작동합니다.

<?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>

실제로 backround에 색상이 ColorDrawable 역할을하는 당신이 배경과 텍스트 뷰의 색상을 설정하지만,하지 않을 때 컬러 속성이 작동
아킬 아빠

위의 모든 것을 구현하는 가장 쉽고 쉬운 솔루션입니다.
4gus71n 2015

6

배경 섹터를 만들지 않고 검색하는 사람은 해당 줄을 TextView

android:background="?android:attr/selectableItemBackground"
android:clickable="true"

또한 선택 가능한 용도로 사용하려면 :

android:textIsSelectable="true"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.