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?


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>

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"

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>

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.


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


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.


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.


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>

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.


1
Saya sudah begini awalnya tetapi warna teks tidak berubah karena beberapa alasan.
yanchenko
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.