Destek kitaplığı atıştırma çubuğu metin rengini android: textColor dışında bir şeye nasıl ayarlayabilirim?


96

Tasarım Destek Kitaplığı'nda yeni Snackbar'ı kullanmaya başladım, ancak temanızda "android: textColor" ifadesini tanımladığınızda, bunun snackbar'ın metin rengi için geçerli olduğunu buldum. Birincil metin renginiz koyu ise bu kesinlikle bir sorundur.

görüntü açıklamasını buraya girin

Bunun bir yolunu bilen veya metnimi nasıl renklendirmem gerektiğine dair tavsiyesi olan var mı?

Ocak 2017 DÜZENLEME: (Yanıt Sonrası)

Aşağıdaki sorunu çözmek için bazı özel çözümler olsa da, Snackbar'ların temasını sağlamak için doğru yolu sağlamak muhtemelen iyidir.

İlk olarak, muhtemelen android:textColortemalarınızda tanımlamamalısınız (temayı neyin kullandığını gerçekten bilmiyorsanız). Bu, temanıza bağlanan temelde her görünümün metin rengini ayarlar. Görünümlerinizde varsayılan olmayan metin renkleri tanımlamak istiyorsanız android:primaryTextColor, özel görünümlerinizde bu niteliği kullanın ve bu niteliğe referans verin.

Bununla birlikte, temaları uygulamak için Snackbarlütfen bu kalite kılavuzuna bir üçüncü taraf materyal belgesinden bakın: http://www.materialdoc.com/snackbar/ (Bir xml stiline güvenmemesi için programlı tema uygulamasını izleyin)

Referans için:

// create instance
Snackbar snackbar = Snackbar.make(view, text, duration);

// set action button color
snackbar.setActionTextColor(getResources().getColor(R.color.indigo));

// get snackbar view
View snackbarView = snackbar.getView();

// change snackbar text color
int snackbarTextId = android.support.design.R.id.snackbar_text;  
TextView textView = (TextView)snackbarView.findViewById(snackbarTextId);  
textView.setTextColor(getResources().getColor(R.color.indigo));

// change snackbar background
snackbarView.setBackgroundColor(Color.MAGENTA);  

(Ayrıca kendi özel Snackbardüzenlerinizi de oluşturabilirsiniz , yukarıdaki bağlantıya bakın. Bu yöntem çok zor geliyorsa ve özel Snackbar'ınızın olası destek kitaplığı güncellemeleri yoluyla kesinlikle güvenilir bir şekilde olmasını istiyorsanız bunu yapın).

Alternatif olarak, sorununuzu çözmek için benzer ve belki daha hızlı yanıtlar için aşağıdaki yanıtlara bakın.


çözüm için teşekkürler! mülk aslındaandroid:textColorPrimary
muetzenflo

Bu kapsamlı açıklama için teşekkür ederiz.
Hatalar

"temalarınızda muhtemelen android: textColor'u tanımlamamalısınız ..." benim için anahtar buydu, teşekkür ederim!
Tyler

Yanıtlar:


40

Bunun zaten yanıtlandığını biliyorum, ancak bulduğum en kolay yol, Html.fromHtmlyöntemi ve bir fontetiketi kullanarak doğrudan yapmaktı

Snackbar.make(view, 
       Html.fromHtml("<font color=\"#ffffff\">Tap to open</font>").show()

3
Tek hat olduğu için bu çözümü tercih ediyorum.
Lahiru Chandima

1
Bu sorunun asıl çözümü bu değil. Kullanın: snackbar.setActionTextColor (Color.WHITE) .show ();
Ahamadullah Saikat

Snackbar ayarında bir hata var / oldu, renk hiçbir şey yapmadı. Bu yöntem ne olursa olsun işe yarar, ancak diğerleri için en uygun çözüm olmayabilir.
JPM

Bu, API seviyesi> 24 gerektirir.
frank17

171

Bunu Android Tasarım Destek Kitaplığı'nın yeni özellikleri nelerdir ve Snackbar'ı nasıl kullanabilirim?

Bu, bir Snackbar'daki metin rengini değiştirmek için benim için çalıştı.

Snackbar snack = Snackbar.make(view, R.string.message, Snackbar.LENGTH_LONG);
View view = snack.getView();
TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text);
tv.setTextColor(Color.WHITE);
snack.show();



GÜNCELLEME: ANDROIDX: dblackker'ın yorumlarda belirttiği gibi, yeni AndroidX destek kitaplığı ile Snackbar TextView'in kimliğini bulmak için kod şu şekilde değişir:

TextView tv = view.findViewById(com.google.android.material.R.id.snackbar_text);
tv.setTextColor(ContextCompat.getColor(requireContext(), R.color.someColor))

2
Bir başkasının bir Snackbar'ın metin boyutunu değiştirmenin bir yolunu boşuna araması durumunda, işte bu!
Janis Peisenieks

2
Bilginize, eylem metni snackbar_actionyerine kullanarak aynısını yapabilirsiniz snackbar_text. Bir örnek için bu yanıta bakın: stackoverflow.com/a/36800101/293280
Joshua Pinter

7
Bu en iyi ihtimalle bir hack'tir - destek kitaplığının gelecekteki bir sürümünde android.support.design.R.id.snackbar_text için kimlik değiştiğinde ne olur? Styles.xml dosyasında geçersiz kılınabilecek bir tür varsayılan SnackBar stili yok mu?
DiscDev

8
Bu kimlik, destek kitaplığının gelecekteki bir sürümünde gerçekten değiştirildi, şimdi boş bir işaretçi alıyorum.
CaptainForge

3
Güncelleme - androidx ile, id şu anda aşağıdaki gibidir:snack.view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
dblackker

15

Hacking android.support.design.R.id.snackbar_textkırılgandır, bunu yapmanın daha iyi veya daha az hileli bir yolu şu olacaktır:

String snackText = getResources().getString(YOUR_RESOURCE_ID);
SpannableStringBuilder ssb = new SpannableStringBuilder()
    .append(snackText);
ssb.setSpan(
    new ForegroundColorSpan(Color.WHITE),
    0,
    snackText.length(),
    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Snackbar.make(
        getView(),
        ssb,
        Snackbar.LENGTH_SHORT)
        .show();

15

Pekala, temelde metin renklerini yapma biçimimi yeniden düzenleyerek bunu düzelttim.

Benim ışığım tema, ben ayarlamak android:textColorPrimaryiçin normal dark textben istiyordum ve set android:textColoriçin white.

Sahip olmak için tüm metin görünümlerimi ve düğmelerimi güncelledim android:textColor="?android:attr/textColorPrimary".

Bu nedenle, snackbar kaynak textColorsağladığı için diğer tüm metnimi olarak ayarladım textColorPrimary.

OCAK 2017 DÜZENLEME: ---------------------------------------------- ------

Bu nedenle, yorumların dediği ve yukarıdaki düzenlenmiş orijinal soruda belirtildiği gibi, android:textColortema içindeki her görünümün metin rengini değiştireceği için muhtemelen temalarınızda tanımlamamanız gerekir .


Bu görevi yeni tamamladım, vay be, biraz zaman aldı! Ancak, eskimiş Tercihler etkinliğim için aşağıdaki "m vai's" yöntemini kullanmam gerekiyordu (tercihler.xml kullanarak). Sanırım uygulamamın stilini çok daha doğru bir şekilde temaya dayalı olarak bıraktı ki bu güzel. +1
BrantApps

1
Değil iyi bir çözüm IMO i ... textview ve adil değişim snakbar metin rengi için gerçek tema tutmak istiyorum
issamux

1
Temanızda hiç tanımlamamanız gerekiyor android:textColor. Bu bir stil özelliği TextView. Eğer bunu tanımlarsanız tema her metin rengini geçersiz TextViewveya ButtonXML, metin rengi belirtmez. Bu aynı zamanda normalde koyu tema kaplamasından renk alacak olan snackbar mesajıdır .
Eugen Pechanec

15

Projelerimde kullandığım bu kotlin uzantı işlevini oluşturdu:

fun Snackbar.setTextColor(color: Int): Snackbar {
    val tv = view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
    tv.setTextColor(color)

    return this
}

Beklediğiniz gibi kullanım:

Snackbar.make (view, R.string.your_string, Snackbar.LENGTH_LONG) .setTextColor (Color.WHITE) .show ()


Kotlin genişletme yöntemlerinin basit kullanımını sevin! ;-)
Patrick Kuijpers

14
com.google.android.material.R.id.snackbar_textAndroidX'e geçiyorsanız kullanın .
Rishabh876

Değiştirildi @ Rishabh876 :)
Richard

12

Bir yaklaşım, aralıkları kullanmaktır:

final ForegroundColorSpan whiteSpan = new ForegroundColorSpan(ContextCompat.getColor(this, android.R.color.white));
SpannableStringBuilder snackbarText = new SpannableStringBuilder("Hello, I'm white!");
snackbarText.setSpan(whiteSpan, 0, snackbarText.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE);

Snackbar.make(view, snackbarText, Snackbar.LENGTH_LONG)
                .show();

Açıklıklarla, bir Snackbar'ın içine birkaç renk ve stil de ekleyebilirsiniz. İşte güzel bir rehber:

https://androidbycode.wordpress.com/2015/06/06/material-design-snackbar-using-the-design-support-library/


9

AndroidX'e geçtiyseniz , snackbar'daki metnin rengini değiştirmek com.google.android.material.R.id.snackbar_textyerine kullanın android.support.design.R.id.snackbar_text.


Madalyayı hak ediyorsun.
frank17

@ frank17, burada birkaç yorumda bahsedildi.
CoolMind

6

Gördüğüm tek yol getView()çocuğunu kullanmak ve onun üzerinden geçmek. İşe yarayacak mı bilmiyorum ve göründüğü kadar kötü. Umarım yakında bu sorunla ilgili bazı API eklerler.

Snackbar snack = Snackbar.make(...);
ViewGroup group = (ViewGroup) snack.getView();
for (int i = 0; i < group.getChildCount(); i++) {
    View v = group.getChildAt(i);
    if (v instanceof TextView) {
        TextView t = (TextView) v;
        t.setTextColor(...)
    }
}
snack.show();

6

Kodunuzu AndroidX'e taşıyacaksanız, TextView özelliği artık:

com.google.android.material.R.id.snackbar_text

2

Özel renklere ihtiyacım olduğunda kullandığım şey bu

    @NonNull
    public static Snackbar makeSnackbar(@NonNull View layout, @NonNull CharSequence  text, int duration, int backgroundColor, int textColor/*, int actionTextColor*/){
        Snackbar snackBarView = Snackbar.make(layout, text, duration);
        snackBarView.getView().setBackgroundColor(backgroundColor);
        //snackBarView.setActionTextColor(actionTextColor);
        TextView tv = (TextView) snackBarView.getView().findViewById(android.support.design.R.id.snackbar_text);
        tv.setTextColor(textColor);
        return snackBarView;
    }

Ve şu şekilde tüketilir:

CustomView.makeSnackbar(view, "Hello", Snackbar.LENGTH_LONG, Color.YELLOW,Color.CYAN).setAction("DO IT", myAction).show();

2

Temamı değiştirdim

Theme.AppCompat.Light.NoActionBar

-e

Theme.AppCompat.NoActionBar 

İşe yaradı. Işık veya başka bir tema yerine basit bir tema kullanmayı deneyin.


2

Snackbar'da TextView'i id ile bulurken kirli ve hilekar çözümü kullanmaya karar verirseniz ve zaten androidx'e geçtiyseniz, işte kod:

val textViewId = com.google.android.material.R.id.snackbar_text
val snackbar = Snackbar.make(view, "Text", Snackbar.LENGTH_SHORT)
val textView = snackbar.view.findViewById(textViewId) as TextView
textView.setTextColor(Color.WHITE)

2

Şu anda (Ocak 2020) ile com.google.android.material:material:1.2.0ve muhtemelen de1.1.0

Bu stilleri geçersiz kılarak bunu yapmanın en iyi yolu kesinlikle:

<item name="snackbarStyle">@style/Widget.MaterialComponents.Snackbar</item>
<item name="snackbarButtonStyle">@style/Widget.MaterialComponents.Button.TextButton.Snackbar</item>
<item name="snackbarTextViewStyle">@style/Widget.MaterialComponents.Snackbar.TextView</item>

.BridgeSonunda ile maddi bir tema kullanırsanız , herhangi bir nedenle, bu stillerin hiçbiri tanımlanmaz. Dolayısıyla Snackar, bu stiller olmadan bazı eski düzenleri kullanacaktır.

Ben de o kaynak kodunda bulunan snackbarButtonStyleve snackbarTextViewStylekullanılan edilmeyecektir aksi tanımlanmalıdır.



1

Kimliğe göre bul benim için işe yaramadı, bu yüzden başka bir çözüm buldum:

Snackbar snackbar = Snackbar.make(view, text, duration);//just ordinary creation

ViewGroup snackbarView = (ViewGroup) snackbar.getView();
SnackbarContentLayout contentLayout = (SnackbarContentLayout) snackbarView.getChildAt(0);
TextView tvText = contentLayout.getMessageView();
tvText.setTextColor(/*your color here*/);

//set another colors, show, etc

1

Kullanın SnackbarMalzeme Bileşenleri Kütüphanesi dahildir ve uygulamak

  • setTextColor metin rengini tanımlamak için
  • setActionTextColoreylem tarafından kullanılan metin rengini tanımlamak için. Bir renk veya renk seçici kullanabilirsiniz
  • setBackgroundTint Snackbar'ın arka plan rengini tanımlamak için

Gibi bir şey:

Snackbar snackbar = Snackbar.make(view, "My custom Snackbar", Snackbar.LENGTH_LONG);        
snackbar.setTextColor(ContextCompat.getColor(this,R.color.xxxxx));
snackbar.setActionTextColor(ContextCompat.getColor(this,R.color.my_selector));
snackbar.setBackgroundTint(ContextCompat.getColor(this,R.color.xxxx));
snackbar.show();

görüntü açıklamasını buraya girin


0

Snackbar'ın her iki metin görünümünün bir örneğini elde etmeye yardımcı olacak basit bir kodum var, bundan sonra bir metin görünümünde geçerli olan tüm yöntemleri çağırabilirsiniz.

Snackbar snackbar = Snackbar.make( ... )    // Create Snack bar


snackbar.setActionTextColor(getResources().getColor(R.color.white));  //if you directly want to apply the color to Action Text

TextView snackbarActionTextView = (TextView) snackbar.getView().findViewById( android.support.design.R.id.snackbar_action );

snackbarActionTextView.setTextColor(Color.RED);  //This is another way of doing it

snackbarActionTextView.setTypeface(snackbarActionTextView.getTypeface(), Typeface.BOLD);

//Below Code is to modify the Text in Snack bar
TextView snackbarTextView = (TextView) snackbar.getView().findViewById(android.support.design.R.id.snackbar_text);
snackbarTextView.setTextSize( 16 );
snackbarTextView.setTextColor(getResources().getColor(R.color.white));

0

Değerli geliştirme zamanınızdan tasarruf etmek için, işte kullandığım statik yöntem:

public static void snack(View view, String message) {
    if (!TextUtils.isEmpty(message)) {
        Snackbar snackbar = Snackbar.make(view, message, Snackbar.LENGTH_SHORT);
        snackbar.getView().setBackgroundColor(Color.YELLOW);
        TextView tv =  snackbar.getView().findViewById(android.support.design.R.id.snackbar_text); //snackbar_text
        tv.setTextColor(Color.BLACK);
        snackbar.show();
    }
}

Şöyle görünüyor:

siyah metinli sarı büfe


0

Eğer varsa KOTLIN bir uzantı oluşturabilirsiniz:

fun Snackbar.withTextColor(color: Int): Snackbar {
    val tv = this.view.findViewById(android.support.design.R.id.snackbar_text) as TextView
    tv.setTextColor(color)
    return this
}

Kullanım :

yourSnackBar.withTextColor(Color.WHITE).show()

benimki ile aynı cevap 😉
Richard

0

Yeni AndroidX Jitpack bileşenlerine göre

implementation 'com.google.android.material:material:1.0.0'

Oluşturduğum bu uzantıyı kullan

inline fun View.snack(message: String, length: Int = Snackbar.LENGTH_LONG,
 f: Snackbar.() -> Unit) {
val snack = Snackbar.make(this, message, length)
snack.f()
snack.show()
}

fun Snackbar.action(action: String, actionColor: Int? = null, textColor: Int? = null, listener: (View) -> Unit) {
setAction(action, listener)
actionColor?.let {
    setActionTextColor(it)
    }
textColor?.let {
    this.view.findViewById<TextView>(R.id.snackbar_text).setTextColor(it)
    }
}

Bunu böyle kullan

btn_login.snack(
        getString(R.string.fields_empty_login),
        ContextCompat.getColor(this@LoginActivity, R.color.whiteColor)
    ) {
        action(getString(R.string.text_ok), ContextCompat.getColor(this@LoginActivity, R.color.gray_300),ContextCompat.getColor(this@LoginActivity, R.color.yellow_400)) {
            this@snack.dismiss()
        }
    }

0

Bu problemin bu tür çözmek için benim geçici çözüm olduğunu androidxkullanılarakkotlin

 fun showSnackBar(message: String) {
        mContent?.let {
            val snackbar = Snackbar.make(it, message, Snackbar.LENGTH_LONG)
            val snackbarView = snackbar.view
            val tv = snackbarView.findViewById<TextView>(R.id.snackbar_text)
            tv.setTextColor(Color.WHITE) //change the color of text
            tv.maxLines = 3 //specify the limit of text line
            snackbar.duration = BaseTransientBottomBar.LENGTH_SHORT //specify the duraction of text message
            snackbar.show()
        }
    }

Aşağıdaki gibi yöntem mContentiçinde başlatmanız gerekironViewCreated

var mContent: View? = null
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        mContent = view
    }

-1

Ben de aynı sorunu fark ettim. Buradaki cevaplar sayesinde, sadece bunu değiştirerek bu sorunu daha kolay çözmeye yardımcı olabilecek küçük bir sınıf oluşturdum:

Snackbar.make(view, "Error", Snackbar.LENGTH_LONG).show();

Bununla:

Snackbar2.make(view, "Error", Snackbar.LENGTH_LONG).show();

İşte sınıfım:

public class Snackbar2 {
static public Snackbar make(View view, int resid, int duration){
    Snackbar result = Snackbar.make(view, resid, duration);
    process(result);
    return result;
}
static public Snackbar make(View view, String text, int duration){
    Snackbar result = Snackbar.make(view, text, duration);
    process(result);
    return result;
}
static private void process(Snackbar snackbar){
    try {
        View view1= snackbar.getView();

        TextView tv = (TextView) view1.findViewById(android.support.design.R.id.snackbar_text);
        tv.setTextColor(Color.WHITE);

    }catch (Exception ex)
    {
        //inform about error
        ex.printStackTrace();
    }
}

}


1
Bu bir hack'tir ve statik olması için çeşitli destek kitaplığı görünümlerinin kimliklerine dayanır. Her ne pahasına olursa olsun bu çözümden kaçınırdım.
DiscDev
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.