Селектор Android та колір тексту


184

Я хочу, щоб простий TextViewповодився так, як simple_list_item_1це ListViewробив. Ось XML:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="wrap_content" android:layout_width="fill_parent"
    android:gravity="center" android:focusable="true"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:background="@android:drawable/list_selector_background" />

Все працює, окрім кольору тексту, який (очікувано) не змінюється у фокусованому стані. Як зробити так, щоб це змінилося textAppearanceLargeInverse?


Якщо хтось шукає файл XML, він тут: developer.android.com/resources/samples/Home/res/color/…
swinefeaster

Відповіді:


403

Я отримав, зробивши кілька тестів, поки один не працював, так: res / color / button_dark_text.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="#FFFFFF" /> <!-- default -->
 </selector>

res / layout / view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:orientation="vertical"
   android:layout_width="fill_parent"
   android:layout_height="fill_parent"
   >
    <Button
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:text="EXIT"
       android:textColor="@color/button_dark_text" />
</LinearLayout>

8
без андроїда: додаток, що
перетягує

4
@neufuture: вам потрібно скористатисяandroid:textColor="@color/button_dark_text"
Пол,

3
Є документ, що описує списки державних кольорів: developer.android.com/guide/topics/resources/…
Rick77

Як цікавість, вона також працює, коли активовано текст, кнопку або будь-який елемент, наприклад, для елемента списку. <item android: state_activate = "справжній" android: color = "@ android: color / white" />
jiahao

Чи повинен селектор дійсно знаходитися під res/colorпапкою?
mr5

79

І селектор - це відповідь і тут.

Шукайте у джерелах яскравий_text_dark_focused.xml, додайте до свого проекту в каталозі res / color і перейдіть із TextView як

android:textColor="@color/bright_text_dark_focused"

5
Я думаю, що це змінилося на "basic_text_dark_focused.xml".
greg7gkb

11
Це просто підірвало мою думку. Я весь цей час спілкувався зі слухачами, щоб змінити колір тексту. Щелепа на підлозі. Блискуче!
Артем Русаковський

Ніколи не думав, що селектори також працюють для textColor, дуже просто.
Drejc

Я спробував це з кореневою компоновкою думки, яку я зробив для себе ListFragment, і в результаті виявилося купа помилок . Що я роблю неправильно?
MowDownJoe

ми не можемо використовувати @android: кольоровий / білий там. Показ довідки щодо вмісту недоступний, коли я натискаю Ctrl + пробіл
LOG_TAG

31

Ось моя реалізація, яка поводиться точно як пункт у списку (принаймні на 2.3)

res / layout / list_video_footer.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <TextView
        android:id="@+id/list_video_footer"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:background="@android:drawable/list_selector_background"
        android:clickable="true"
        android:gravity="center"
        android:minHeight="98px"
        android:text="@string/more"
        android:textColor="@color/bright_text_dark_focused"
        android:textSize="18dp"
        android:textStyle="bold" />

</FrameLayout>

res / color /right_text_dark_focused.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="#444"/>
    <item android:state_focused="true" android:color="#444"/>
    <item android:state_pressed="true" android:color="#444"/>
    <item android:color="#ccc"/>

</selector>

Це добре працювало для мене, і в моєму випадку спрацювало досить добре для коригування виділених / непросвічених кольорів для моєї реалізації
TabHost

27

Для того, щоб змусити його працювати у виборі списку, використовуйте наступний код:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:color="#fff"/>
    <item android:state_activated="true" android:color="#fff"/>
    <item android:color="#000" />
</selector>

Мабуть, ключ - state_activated="true"держава.


17
Не забудьте розмістити цей файл у папці res / color
Nguyen Minh Binh

4

Ось приклад селектора. Якщо ви використовуєте eclipse, він не пропонує щось під час натискання клавіші ctrl та пробілу: / ви повинні ввести його.

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/btn_default_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/btn_default_selected"
    android:state_focused="true"
    android:state_enabled="true"
    android:state_window_focused="true"  />
<item android:drawable="@drawable/btn_default_normal" />

Ви можете подивитися для довідки;

http://developer.android.com/guide/topics/resources/dravable-resource.html#StateList


2

Я завжди використовував вищезазначене рішення, не шукаючи більше після цього. ;-)

Однак сьогодні я натрапив на щось і подумав поділитися цим. :)

Ця функція дійсно доступна в API 1 і називається ColorStateList , де ми можемо надавати кольори різним станам віджетів (як ми вже знаємо).

Це також дуже добре зафіксовано тут.


2

У 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/blue" android:state_focused="true" />
    <item android:color="@color/blue" android:state_selected="true" />
    <item android:color="@color/green" />
</selector>

Потім у TextViewвикористанні:

<TextView
    android:id="@+id/value_1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Text"
    android:textColor="@color/text_selector"
    android:textSize="15sp"
    />

А в коді потрібно встановити прослуховувач кліків.

private var isPressed = false

private fun TextView.setListener() {
    this.setOnClickListener { v ->
        run {
            if (isPressed) {
                v.isSelected = false
                v.clearFocus()
            } else {
                v.isSelected = true
                v.requestFocus()
            }
            isPressed = !isPressed
        }
    }
}

override fun onResume() {
    super.onResume()
    textView.setListener()
}

override fun onPause() {
    textView.setOnClickListener(null)
    super.onPause()
}

Вибачте, якщо є помилки, я змінив код перед публікацією і не перевірив.


1

Якщо використовували TextViews на вкладках, це визначення селектора працювало для мене (спробував Клаус Бальдуїно, але не вдалося):

<?xml version="1.0" encoding="utf-8"?>    
<selector xmlns:android="http://schemas.android.com/apk/res/android">

  <!--  Active tab -->
  <item
    android:state_selected="true"
    android:state_focused="false"
    android:state_pressed="false"
    android:color="#000000" />

  <!--  Inactive tab -->
  <item
    android:state_selected="false"
    android:state_focused="false"
    android:state_pressed="false"
    android:color="#FFFFFF" />

</selector>

0

Ви пробували setOnFocusChangeListener? У межах обробника ви можете змінити зовнішній вигляд тексту.

Наприклад:

TextView text = (TextView)findViewById(R.id.text);
text.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            ((TextView)v).setXXXX();
        } else {
            ((TextView)v).setXXXX();
        }
    }
});

Потім ви можете застосувати будь-які зміни, які ви хочете, якщо вони зосереджені чи ні. Ви також можете використовувати ViewTreeObserver для прослуховування глобальних змін фокусу.

Наприклад:

View all = findViewById(R.id.id_of_top_level_view_on_layout);
ViewTreeObserver vto = all.getViewTreeObserver();
vto.addOnGlobalFocusChangeListener(new ViewTreeObserver.OnGlobalFocusChangeListener() {
    public void onGlobalFocusChanged(
        View oldFocus, View newFocus) {
        // xxxx
    }
});

Я сподіваюся, що це допомагає або дає вам ідеї.


1
Я пішов цим шляхом спочатку, але колір тексту чомусь не змінився.
Янченко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.