Pemilih Android & warna teks

184

Saya ingin sederhana TextViewberperilaku dengan cara simple_list_item_1yang ListViewtidak. Inilah 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" />

Semuanya berfungsi kecuali untuk warna teks yang (diharapkan) tidak berubah dalam kondisi fokus. Bagaimana cara mengubahnya textAppearanceLargeInverse?

yanchenko
sumber
Jika ada yang mencari file xml, ada di sini: developer.android.com/resources/samples/Home/res/color/…
swinefeaster

Jawaban:

404

Saya mendapatkan dengan melakukan beberapa tes sampai satu berhasil, jadi: 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>
Klaus Balduino
sumber
8
tanpa android: drawable aplikasi macet dengan pemilih ini xml
neufuture
4
@neufuture: Anda perlu menggunakanandroid:textColor="@color/button_dark_text"
Paul
3
Ada dokumen yang menjelaskan daftar status warna: developer.android.com/guide/topics/resources/…
Rick77
Sebagai rasa ingin tahu, ini juga berfungsi ketika teks, tombol, atau item apa pun telah diaktifkan, misalnya, untuk item daftar. <item android: state_activated = "true" android: color = "@ android: color / white" />
jiahao
Haruskah pemilih benar-benar berada di bawah res/colorfolder?
mr5
79

Dan pemilih juga jawabannya di sini.

Cari bright_text_dark_focused.xml di sumber, tambahkan ke proyek Anda di bawah direktori res / color dan kemudian merujuk dari TextView sebagai

android:textColor="@color/bright_text_dark_focused"
yanchenko
sumber
5
Saya pikir ini telah berubah menjadi "primary_text_dark_focused.xml".
greg7gkb
11
Ini benar-benar mengejutkan saya. Saya telah menangani hal-hal dengan pendengar untuk mengubah warna teks selama ini. Rahang di lantai. Cemerlang!
Artem Russakovskii
Tidak pernah terpikirkan bahwa penyeleksi juga berfungsi untuk textColor, sangat mudah.
Drejc
Saya mencoba ini dengan Layout root dari tampilan yang saya buat untuk saya ListFragment, dan berakhir dengan banyak kesalahan . Apa yang saya lakukan salah?
MowDownJoe
kita tidak bisa menggunakan @android: warna / putih di sana .. menampilkan bantuan konten tidak tersedia ketika saya menekan Ctrl + space
LOG_TAG
31

Inilah implementasi saya, yang berperilaku persis seperti item dalam daftar (setidaknya pada 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 / bright_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>
Kreker
sumber
Ini bekerja dengan baik untuk saya, dan dalam kasus saya bekerja cukup baik untuk menyesuaikan warna yang disorot / tidak disorot untuk implementasi TabHost saya
oddmeter
27

Untuk membuatnya berfungsi pada seleksi dalam tampilan daftar gunakan kode berikut:

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

Ternyata kuncinya adalah state_activated="true"negara.

Manuel Escrig
sumber
17
Jangan lupa letakkan file ini di bawah folder res / colour
Nguyen Minh Binh
4

Ini adalah contoh pemilih. Jika Anda menggunakan eclipse, itu tidak menyarankan sesuatu ketika Anda mengklik ctrl dan spasi keduanya: / Anda harus mengetiknya.

<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" />

Anda dapat melihat referensi;

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

Günay Gültekin
sumber
2

Saya selalu menggunakan solusi di atas tanpa mencari lebih banyak setelah ini. ;-)

Namun, hari ini saya menemukan sesuatu dan berpikir untuk membagikannya. :)

Fitur ini memang tersedia dari API 1 dan disebut sebagai ColorStateList , di mana kami dapat menyediakan warna ke berbagai status Widget (seperti yang sudah kita ketahui).

Ini juga didokumentasikan dengan sangat baik, di sini.

Atul O Holic
sumber
2

Di res/colortempat file "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>

Kemudian dalam TextViewmenggunakannya:

<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"
    />

Dan dalam kode Anda harus mengatur pendengar klik.

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()
}

Maaf jika ada kesalahan, saya mengubah kode sebelum menerbitkan dan tidak memeriksa.

CoolMind
sumber
1

Jika menggunakan TextViews di tab, definisi pemilih ini berfungsi untuk saya (mencoba Klaus Balduino tetapi tidak):

<?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>
Sam adalah
sumber
0

Sudahkah Anda mencoba setOnFocusChangeListener? Di dalam handler, Anda dapat mengubah tampilan teks.

Misalnya:

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();
        }
    }
});

Anda kemudian dapat menerapkan perubahan apa pun yang Anda inginkan saat fokus atau tidak. Anda juga dapat menggunakan ViewTreeObserver untuk mendengarkan perubahan fokus Global.

Misalnya:

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
    }
});

Saya harap ini membantu atau memberi Anda ide.

lilbyrdie
sumber
1
Saya sudah begini awalnya tetapi warna teks tidak berubah karena beberapa alasan.
yanchenko