Android seçici ve metin rengi


185

Basit bir işin TextViewyolunda davranmasını istiyorum . İşte XML:simple_list_item_1ListView

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

Her şey odaklanmış durumda (beklenen) değişmeyen metin rengi dışında çalışır. Bunu nasıl değiştirebilirim textAppearanceLargeInverse?


Yanıtlar:


404

Biri çalışana kadar birkaç test yaparak aldım, yani: 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 / düzeni / 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
android olmadan: çekilebilir uygulama bu seçici xml ile çöküyor
neufuture

4
@neufuture: kullanmanız gerekiyorandroid:textColor="@color/button_dark_text"
Paul

3
Renk durumu listelerini açıklayan bir belge vardır: developer.android.com/guide/topics/resources/…
Rick77

Merak olarak, metin, düğme veya herhangi bir öğe, örneğin liste öğesi için etkinleştirildiğinde de çalışır. <item android: state_activated = "true" android: renk = "@ android: renkli / beyaz" />
jiahao

Seçici gerçekten res/colorklasör altında mı bulunmalı ?
mr5

79

Ve seçici de burada cevap.

Kaynaklarda bright_text_dark_focused.xml dosyasını arayın, res / color dizini altında projenize ekleyin ve ardından TextView'dan

android:textColor="@color/bright_text_dark_focused"

5
Bu "birincil_metin_dark_focused.xml" olarak değişti düşünüyorum.
greg7gkb

11
Bu sadece aklımı havaya uçurdu. Bunca zaman metin rengini değiştirmek için dinleyicilerle bir şeyler yapıyorum. Çene katta. Parlak!
Artem Russakovskii

Seçicilerin textColor için de çalıştığını düşünmedim, çok kolay.
Drejc

Bunu benim için yaptığım bir görünümün kök Düzeni ile denedim ListFragmentve bir sürü hata ile sona erdi . Neyi yanlış yapıyorum?
MowDownJoe

@android: renk / beyaz'ı kullanamayız .. Ctrl + space tuşlarına
bastığımda

31

İşte tam olarak listedeki öğe gibi davranan uygulamam (en az 2.3'te)

res / düzeni / 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 / renk / 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>

Bu benim için iyi çalıştı ve benim durumumda TabHost uygulaması için vurgulanan / vurgulanmayan renkleri ayarlamak için oldukça iyi çalıştı
oddmeter

27

Liste görünümündeki seçim üzerinde çalışmasını sağlamak için aşağıdaki kodu kullanın:

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

Görünüşe göre anahtar state_activated="true"durum.


17
Bu dosyayı res / color klasörü altına yerleştirmeyi unutmayın
Nguyen Minh Binh

4

İşte seçici örneği. Eclipse kullanıyorsanız, ctrl ve space tuşlarına tıkladığınızda bir şey önermez: / yazmanız gerekir.

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

Referans için bakabilirsiniz;

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


2

Bundan sonra daha fazla arama yapmadan yukarıdaki çözümü her zaman kullandım. ;-)

Ancak bugün bir şeyle karşılaştım ve paylaşmayı düşündüm. :)

Bu özellik gerçekten API 1'den edinilebilir ve ColorStateList olarak adlandırılır çeşitli Widget durumlarına (zaten bildiğimiz gibi) bir renk sağlayabileceğimiz .

Ayrıca burada çok iyi belgelenmiştir .


2

Gelen res/coloryerinde bir dosya "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>

Sonra TextViewkullanımda:

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

Ve kodda bir tıklama dinleyici ayarlamanız gerekir.

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

Üzgünüm, hata varsa, yayınlamadan önce bir kodu değiştirdim ve kontrol etmedi.


1

Sekmelerde TextViews kullanıyorsanız, bu seçici tanım benim için çalıştı (Klaus Balduino'yu denedi, ancak işe yaramadı):

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

Denedin setOnFocusChangeListenermi İşleyici içinde metin görünümünü değiştirebilirsiniz.

Örneğin:

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

Daha sonra odaklanıldığında veya odaklanmadığında istediğiniz değişiklikleri uygulayabilirsiniz. Global odak değişikliklerini dinlemek için ViewTreeObserver'ı da kullanabilirsiniz.

Örneğin:

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

Umarım bu size yardımcı olur veya fikir verir.


1
Başlangıçta bu şekilde gittim, ancak metin rengi bir nedenden dolayı değişmedi.
yanchenko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.