Изменить кликабельный цвет TextView на фокусе и нажать? - PullRequest
27 голосов
/ 21 марта 2011

У меня есть интерактивный TextView, которому я хочу придать некоторые цвета. Но я не знаю как. Вот соответствующие фрагменты кода из моих двух файлов, с которыми я работаю:

TextView title = new TextView(this);
title.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
title.setTextColor(R.color.textcolor);
title.setText(titleLine);
title.setTypeface(null, Typeface.BOLD);
title.setClickable(true);
title.setId(idLine);
title.setFocusable(true);

title.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

                /* Irrelevant code */                   

    }
});

А это мой файл textcolor.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="#000000"/> <!-- pressed -->
    <item android:state_focused="true"
          android:color="#000000"/> <!-- focused -->
    <item android:color="#000000"/> <!-- default -->
</selector>

Когда я использую файл textcolor, набрав title.setTextColor (R.color.textcolor); , цвет текста просто становится серым, независимо от того, нажимаю я его или около того. Что странно, поскольку я написал «# 000000» во всех цветовых полях.
Но если я удаляю код setTextColor, получаю textView светло-серого цвета, а когда я нажимаю его, он становится черным. Но это не те цвета, которые я хочу.

Итак, кто-нибудь может мне помочь с этой проблемой?

Просто чтобы уточнить: я хочу иметь возможность указывать цвета для текста, когда он нормальный, нажат и сфокусирован.

Ответы [ 8 ]

58 голосов
/ 21 марта 2011

Если вы хотите установить цвет с сохранением состояния из кода, вам нужно передать ColorStateList в качестве аргумента setTextColor, передав значение int в метод, что приводит к установкецвет для всех государств.Похоже, что ваш xml не совсем корректен.Пример из ColorStateList документов выглядит следующим образом (должен быть расположен следующим образом: res/color/selector_txt.xml):

 <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_focused="true" android:color="@color/testcolor1"/>
    <item android:state_pressed="true" android:state_enabled="false" android:color="@color/testcolor2" />
    <item android:state_enabled="false" android:color="@color/testcolor3" />
    <item android:color="@color/testcolor5"/>
 </selector>

UPD о том, как установить ColorStateList в цвет текста:

ColorStateList cl = null;
try {
   XmlResourceParser xpp = getResources().getXml(R.color.selector_txt);
   cl = ColorStateList.createFromXml(getResources(), xpp);
} catch (Exception e) {}

Примечание : метод createFromXml(Resources, XmlPullParser parser) устарел на уровне API 23. Использовать createFromXml(Resources, XmlPullParser parser, Theme)

С XML это так же просто, как:

android:textColor="@color/selector_txt"
42 голосов
/ 30 ноября 2011

Шаг 1: Установите цвет текста в xml следующим образом

андроида: TextColor = "@ цвет / text_color"

Шаг 2: Создать res / color / text_color.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android" >

<item android:state_pressed="true"
      android:color="#ffffffff"/> <!-- pressed -->
<item android:state_focused="true"
      android:color="#ff0000ff"/> <!-- focused -->
<item android:color="#ff000000"/>  <!--default -->

</selector>
16 голосов
/ 11 февраля 2013

Попробуйте это .. У меня это сработало:

Имя файла: res / color / bg_tab_text_color.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false" android:state_selected="false" android:color="@color/tab_unselected_text_color"/>
    <item android:state_pressed="true" android:color="@color/tab_selected_text_color"/>
    <item android:state_pressed="false" android:state_selected="true" android:color="@color/tab_selected_text_color"/>
    <item android:color="@color/tab_unselected_text_color"></item>
</selector>

Попробуйте установить цвет в макете XML как:

android:textColor="@color/bg_tab_text_color"
10 голосов
/ 21 марта 2011

Посмотрите в классе R.java (он генерируется автоматически). У вас есть что-то подобное:

 public static final class color {
        public static final int gray_transparent=0x7f050001;
}

Так в вашем коде в строке:

title.setTextColor(R.color.textcolor);

вы устанавливаете не значения из textcolor.xml, а int из R.java (который содержит адрес textcolor.xml). Допустимый способ установить цвет:

title.setTextColor(getResources().getColorStateList(R.color.textcolor));
3 голосов
/ 22 июня 2014

Это очень просто. Попробуйте это .. У меня это сработало:

Имя файла: res / color / bg_tab_text_color.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">

<item android:state_pressed="true" android:drawable="@color/blue" />

Попробуйте установитьцвет в формате XML как:

android:textColor="@color/bg_tab_text_color"
2 голосов
/ 12 апреля 2018

Вот программный способ очень простой:

private void setColorStateList(TextView view) {
        int[][] states = new int[][] {
                new int[] { android.R.attr.state_pressed}, // pressed
                new int[] { android.R.attr.state_focused}, // focused
                new int[] { android.R.attr.state_enabled}  // enabled
        };

        int[] colors = new int[] {
                getResources().getColor(R.color.blue),
                getResources().getColor(R.color.green),
                getResources().getColor(R.color.green) 
        };

        ColorStateList list = new ColorStateList(states, colors);
        view.setTextColor(list);
        view.setClickable(true);
        view.setFocusableInTouchMode(true);
    }
0 голосов
/ 16 февраля 2017

В res / color / text_selector.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/white"
          android:state_selected="true"/>
    <item android:color="#8020e0"/>
</selector>

В макете:

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Word"
    android:textColor="@color/text_selector"
    android:textSize="12sp"/>

В коде:

textView.setSelected(false); // To deselect.
textView.setSelected(true);
0 голосов
/ 12 августа 2016

В res / drawable / tab_textColor.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:color="#FFFFFF" />
    <item android:state_pressed="true" android:color="#FFFFFF" />
    <item android:color="#CCCCCC" />
</selector>



<TextView
    android:id="@+id/title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/icon"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="5dp"
    android:text="@string/tab_indicator_home"
    android:textColor="@drawable/tab_textcolor"
    android:textSize="10sp"
    android:visibility="visible"
    tools:ignore="SmallSp" />
...