Як змінити стиль TextView під час виконання


98

У мене є додаток для Android, на якому, коли користувач натискає a TextView, я хотів би застосувати визначений стиль.

Я думав знайти, textview.setStyle()але його немає. я намагався

textview.setTextAppearance();

але це не працює.


1
Я десь читав, що це неможливо ... stackoverflow.com/questions/2016249/… . Але ви можете встановити деякі властивості окремо.
Флорен

1
Ви пробували: textView.setTextTypeface? developer.android.com/reference/android/widget/…
Джонатан Рот

21
@Falmarri Ви переглядали документи api TextView? Якщо так, то, можливо, ви могли б сказати щось більш конструктивне.
Флетч

Відповіді:


143

Я зробив це, створивши новий XML-файл res/values/style.xmlнаступним чином:

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

У мене також є записи у моєму файлі "strings.xml" на зразок цього:

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

Потім у своєму коді я створив ClickListener, щоб захопити подію натискання на цей TextView: EDIT: Від API 23 'setTextAppearance' застарілий

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

Щоб змінити його назад, скористайтеся цим:

if (Build.VERSION.SDK_INT < 23) {
    myTextView.setTextAppearance(getApplicationContext(), R.style.normalText);
} else{
   myTextView.setTextAppearance(R.style.normalText);
}
myTextView.setBackgroundResource(R.color.normalTextViewColor);

2
Насправді це не працює з тіньовими стилями. Якщо ви хочете змінити тінь, потрібно зробити це таким чином: lockText.setShadowLayer (20, 4, 4, 0xFFFF0000);
Лукас

3
Щоб уникнути перевірки SDK, ви можете використовувати TextViewCompat.setTextAppearance (myTextView, R.style.myStyle);
Джастін Фідлер

90

Як запропонував Джонатан, використовуючи textView.setTextTypefaceтвори, я просто використовував це в додатку кілька секунд тому.

textView.setTypeface(null, Typeface.BOLD); // Typeface.NORMAL, Typeface.ITALIC etc.

9
Ви можете використовувати textView.setTypeface (null, Typeface.BOLD); textView..setTypeface (null, Typeface.ITALIC); textView.setTypeface (null, Typeface.BOLD_ITALIC);
пецепс

2
textView.setTypeface (null, Typeface.BOLD) - це те, що працювало для мене. Звичайно, ви можете використовувати 1 замість цього, але, мабуть, це не є хорошою практикою вводити константи вручну. Краще використовувати заздалегідь задані змінні в бібліотеках.
Піджун

4
Не рекомендуйте людям використовувати замість констант
ints

3
Хороший! Моя помилка полягала в тому, що я надсилав свій старий шрифт у першому параметрі. Так воно працює, коли я змінюю NORMAL -> BOLD, але не BOLD -> NORMAL. Я не знав, що перший параметр може бути нульовим! Тепер для мене це чудово працює!
Феліпе

12
TextView tvCompany = (TextView)findViewById(R.layout.tvCompany);
tvCompany.setTypeface(null,Typeface.BOLD);

Ви встановлюєте його з коду. Шрифт


4

Програмно: час виконання

Ви можете це робити програмно, використовуючи 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: Час розробки

Ви також можете встановити в XML:

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

Сподіваюсь, це допоможе

Підведено підсумки


2

я виявив textView.setTypeface(Typeface.DEFAULT_BOLD);найпростіший метод.


Це змінює Typeface. не стиль, визначений ОП.
HBG

Правда, все-таки це був найпростіший метод - і наскільки я пам’ятаю єдиний метод - на час публікації. Я не впевнений, чи був тим часом доданий новий метод API, який дозволяє змінити "стиль" на жирний, не змінюючи шрифт. Будь ласка, виправте мене, якщо я помиляюся.
sfera

1

спробуйте цей рядок коду.

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

тут він отримає поточний Typeface з цього перегляду тексту та замінить його за допомогою нового Typeface. Новий шрифт тут є, DEFAULT_BOLDале ви можете застосувати багато іншого.


ви краще поясніть, чому ваш код вирішить його проблему, дякую.
Мухаммед Рефаат

ОП хоче змінити стиль, а не Typeface.
HBG

0

Див. Doco для setText () у TextView http://developer.android.com/reference/android/widget/TextView.html

Щоб стилізувати рядки, прикріпіть об’єкти android.text.style. * До SpannableString або перегляньте документацію про доступні типи ресурсів для прикладу встановлення форматованого тексту у файлі ресурсу XML.


0

Залежно від того, який стиль ви хочете встановити, ви повинні використовувати різні методи. У матеріалів TextAppearance є свій сетер, у TypeFace є власний сетер, у фону є власний сетер тощо.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.