Jak zmienić styl TextView w czasie wykonywania

98

Mam aplikację na Androida, w której po dotknięciu przez użytkownika TextViewchcę zastosować zdefiniowany styl.

Myślałem, aby znaleźć, textview.setStyle()ale nie istnieje. próbowałem

textview.setTextAppearance();

ale to nie działa.

Kryzys
źródło
1
Czytałem gdzieś, że nie jest to możliwe ... stackoverflow.com/questions/2016249/… . Ale możesz ustawić niektóre właściwości osobno.
Floern,
1
Czy próbowałeś: textView.setTextTypeface? developer.android.com/reference/android/widget/…
Jonathan Roth,
21
@Falmarri Czy TY przeglądałeś dokumenty interfejsu API TextView? Jeśli tak, może mógłbyś powiedzieć coś bardziej konstruktywnego.
Fletch

Odpowiedzi:

143

Zrobiłem to, tworząc nowy plik XML res/values/style.xmlw następujący sposób:

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <style name="boldText">
        <item name="android:textStyle">bold|italic</item>
        <item name="android:textColor">#FFFFFF</item>
    </style>

    <style name="normalText">
        <item name="android:textStyle">normal</item>
        <item name="android:textColor">#C0C0C0</item>
    </style>

</resources>

Mam również wpisy w moim pliku „strings.xml”, takie jak ten:

<color name="highlightedTextViewColor">#000088</color>
<color name="normalTextViewColor">#000044</color>

Następnie w moim kodzie utworzyłem ClickListener, aby przechwycić zdarzenie tap w tym TextView: EDIT: Jak z API 23 „setTextAppearance” jest przestarzałe

    myTextView.setOnClickListener(new View.OnClickListener() {
                public void onClick(View view){
                    //highlight the TextView
                    //myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    if (Build.VERSION.SDK_INT < 23) {
       myTextView.setTextAppearance(getApplicationContext(), R.style.boldText);
    } else {
       myTextView.setTextAppearance(R.style.boldText);
    }
     myTextView.setBackgroundResource(R.color.highlightedTextViewColor);
                }
            });

Aby to zmienić, użyjesz tego:

if (Build.VERSION.SDK_INT < 23) {
    myTextView.setTextAppearance(getApplicationContext(), R.style.normalText);
} else{
   myTextView.setTextAppearance(R.style.normalText);
}
myTextView.setBackgroundResource(R.color.normalTextViewColor);
Glenn
źródło
2
Właściwie to nie działa ze stylami cieni. Jeśli chcesz zmienić cień, musisz to zrobić w ten sposób: lockText.setShadowLayer (20, 4, 4, 0xFFFF0000);
Lukas
3
Aby uniknąć sprawdzania SDK, możesz użyć TextViewCompat.setTextAppearance (myTextView, R.style.myStyle);
Justin Fiedler,
90

Jak zasugerował Jonathan, używając textView.setTextTypefacedzieł, właśnie użyłem go w aplikacji kilka sekund temu.

textView.setTypeface(null, Typeface.BOLD); // Typeface.NORMAL, Typeface.ITALIC etc.
DKDiveDude
źródło
9
Możesz użyć textView.setTypeface (null, Typeface.BOLD); textView..setTypeface (null, Typeface.ITALIC); textView.setTypeface (null, Typeface.BOLD_ITALIC);
peceps
2
TextView.setTypeface (null, Typeface.BOLD) jest tym, co zadziałało. Oczywiście możesz zamiast tego użyć 1, ale myślę, że ręczne wprowadzanie stałych nie jest dobrą praktyką. Lepiej używaj predefiniowanych zmiennych w bibliotekach.
Pijusn
4
Nie zachęcaj ludzi do używania intów zamiast stałych
Chris.Jenkins
3
Dobry! Mój błąd polegał na tym, że w pierwszym parametrze wysyłałem stary krój pisma. Tak więc działa, gdy zmienię NORMAL -> BOLD, ale nie BOLD -> NORMAL. Nie wiedziałem, że pierwszy parametr może być pusty! Teraz dla mnie działa dobrze!
Felipe
12
TextView tvCompany = (TextView)findViewById(R.layout.tvCompany);
tvCompany.setTypeface(null,Typeface.BOLD);

Ustawiłeś to z kodu. Krój pisma

Azhar
źródło
4

Programowo: czas wykonywania

Możesz to zrobić programowo za pomocą setTypeface ():

textView.setTypeface(null, Typeface.NORMAL);      // for Normal Text
textView.setTypeface(null, Typeface.BOLD);        // for Bold only
textView.setTypeface(null, Typeface.ITALIC);      // for Italic
textView.setTypeface(null, Typeface.BOLD_ITALIC); // for Bold and Italic

XML: Czas projektowania

Możesz również ustawić w XML:

android:textStyle="normal"
android:textStyle="normal|bold"
android:textStyle="normal|italic"
android:textStyle="bold"
android:textStyle="bold|italic"

Mam nadzieję, że to pomoże

Summved

Summved Jain
źródło
2

Okazało się, textView.setTypeface(Typeface.DEFAULT_BOLD);że jest to najprostsza metoda.

sfera
źródło
To zmienia krój pisma. nie styl określony przez OP.
HBG
To prawda, nadal była to najprostsza metoda - i o ile pamiętam jedyna - w momencie publikacji. Nie jestem pewien, czy w międzyczasie dodano nową metodę API, która umożliwia zmianę „stylu” na pogrubiony bez zmiany kroju pisma. Proszę popraw mnie jeżeli się mylę.
sfera
1

wypróbuj tę linię kodu.

textview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);

tutaj, pobierze aktualny krój pisma z tego widoku tekstu i zastąpi go nowym krojem. Nowy krój jest tutaj, DEFAULT_BOLDale możesz zastosować o wiele więcej.

Md. Sajedul Karim
źródło
wolałbyś raczej wyjaśnić, dlaczego twój kod rozwiąże jego problem, dzięki.
Muhammed Refaat
OP chce zmienić styl, a nie krój pisma.
HBG
0

W zależności od tego, jaki styl chcesz ustawić, musisz użyć różnych metod. Rzeczy TextAppearance mają swój własny seter, TypeFace ma swój własny seter, tło ma swój własny seter itp.

akohout
źródło