Селектор Textcolor не работает
Я делал это раньше. Я скопировал. Я скопировал много других примеров из сети. Я просто не могу заставить селектор textcolor работать. Он устанавливает цвет по умолчанию для textview, но он не изменится, если вы нажмете на textview. Settings_selector для фона работает нормально.
это макет:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/settings_selector"
android:clickable="true"
android:id="@+id/llRecentChanges"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:paddingLeft="5dp">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/llRecentChanges2"
android:layout_weight="1"
android:layout_gravity="center_vertical">
<TextView
android:id="@+id/tvAbout"
android:text="@string/settings_recentchanges"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16dp"
android:textColor="@drawable/settings_selector_txt" >
</TextView>
<TextView
android:id="@+id/tvAbout2"
android:text="@string/settings_recentchanges2"
android:gravity="center_vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/settings_selector_txt"
android:textSize="10dp">
</TextView>
</LinearLayout>
</LinearLayout>
это settings_selector_txt xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true"
android:state_pressed="false"
android:color="#FFFFFF" />
<item android:state_focused="true"
android:state_pressed="true"
android:color="#ffa800" />
<item android:state_focused="false"
android:state_pressed="true"
android:color="#ffa800" />
<item android:color="#FFFFFF" />
</selector>
или это
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="#444"/>
<item android:state_focused="true" android:color="#444"/>
<item android:state_pressed="true" android:color="#444"/>
<item android:color="#ccc"/>
</selector>
или это
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:state_pressed="false" android:color="#ffffff" />
<item android:state_focused="true" android:state_pressed="true" android:color="#000000" />
<item android:state_focused="false" android:state_pressed="true" android:color="#000000" />
<item android:color="#ffffff" />
</selector>
ни один из они работают. Помещение селектора xml в папку цвета также не является решением. Есть идеи?
5 ответов
убедитесь, что ваш TextView готов к прослушиванию состояний, на которые вы подаете заявку. Например, чтобы иметь возможность достичь "state_pressed", ваш textView должен быть кликабельным:
android:clickable="true"
EDIT: вот так. Этот макет делает работу. Обратите внимание, что представление, собирающее событие click, является linearLayout, но TextView воспроизводит его из-за "duplicateParentState", установленного в true. Селектор цветов будет заботиться о цветах для различных штат.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/testLlayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:clickable="true" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@drawable/textview_selector"
android:duplicateParentState="true"
android:text="TextView" />
</LinearLayout>
и вот код для выбора цвета.
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="#444"/>
<item android:state_focused="true" android:color="#444"/>
<item android:state_pressed="true" android:color="#444"/>
<item android:color="#ccc"/>
</selector>
это должно быть так.
нет необходимости устанавливать android:clickable="true"
в TextView или android:duplicateParentState="true"
.
решение
Шаг-1: Определите свой селектор цвета под res / color папка (селектор цвета Jose L Ugia хорош для этого.)
Шаг 2: установите этот селектор цвета в TextView как android:textColor="@color/m_text_selector"
(не как @drawable/*!!!)
Примечание: если вы хотите установить селектор textColor программно, вы должны получить селектор как список состояния цвета не как цвет;
textView.setTextColor(getResources().getColorStateList(R.color.m_text_selector));
Вот и все.
убедитесь, что все макеты, которые могут обернуть ваши TextViews перед вашим "кликабельным" макетом, также имеют duplicateParentState="true", иначе текстовое представление не достигнет состояния элемента, которое вы хотите.
Я думаю, используя ColorStateList лучший выбор для старых и последних версий Android.
int[][] states = new int[][] {
new int[] { android.R.attr.state_pressed}, // pressed
new int[] { android.R.attr.state_focused}, // focused
new int[] {}
};
int[] colors = new int[] {
getResources().getColor(R.color.green_color), // green
getResources().getColor(R.color.green_color), // green
getResources().getColor(R.color.white) // white
};
ColorStateList list = new ColorStateList(states, colors);
mTextView.setFocusable(true);
mTextView.setClickable(true);
mTextView.setTextColor(list);