Android - встановити TextView TextStyle програмно?


232

Чи є спосіб програмно встановити textStyleатрибут TextView? Здається, не існує setTextStyle()методу.

Щоб було зрозуміло, я не говорю про стилі View / Widget! Я говорю про наступне:

<TextView
  android:id="@+id/my_text"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:text="Hello World"
  android:textStyle="bold" />

1
ви можете посилатися на посилання нижче, і замок зверху 1 відповідь stackoverflow.com/questions/6200533 / ...
Тьеп

Будь ласка, перевірте мою відповідь тут . Сподіваюсь, це допоможе вам
Summved Jain

Відповіді:


410
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface - це атрибут textStyle.

Як додав Shankar V , для збереження раніше встановлених атрибутів шрифту можна використовувати:

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

14
так і має бутиtextview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);
Санкар V

2
@IlyaEremin, щоб зберегти раніше встановлений шрифт, потрібно використовувати його так.
Sankar V

Мою відповідь відредагував на основі коментаря @SankarV.
Раз

13
Я думаю, ви повинні втратити DEFAULT: hold.title.setTypeface (hold.title.getTypeface (), Typeface.BOLD);
Іман Акбарі

Насправді textview.getTypeface().getStyle()цеandroid:textStyle
П’єр

126

Скажімо, у вас є стиль, який називається RedHUGEText для ваших значень / styles.xml:

<style name="RedHUGEText" parent="@android:style/Widget.TextView">
    <item name="android:textSize">@dimen/text_size_huge</item>
    <item name="android:textColor">@color/red</item>
    <item name="android:textStyle">bold</item>
</style>

Просто створіть TextView як зазвичай у файлі XML / your_layout.xml, скажімо так:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" />

І в коді java своєї діяльності ви робите це:

TextView textViewTitle = (TextView) findViewById(R.id.text_view_title);
textViewTitle.setTextAppearance(this, R.style.RedHUGEText);

Це працювало для мене! І він застосував колір, розмір, гравітацію і т. Д. Я без проблем використовував їх у телефонах і планшетах з Android API Levels від 8 до 17. Зауважте, що на Android 23 цей метод застарілий. Аргумент контексту випав, тому останнім рядком повинен бути:

textViewTitle.setTextAppearance(R.style.RedHUGEText);

Пам'ятайте ... це корисно лише в тому випадку, якщо стиль тексту дійсно залежить від умови вашої логіки Java або ви будуєте інтерфейс "на льоту" з кодом ... якщо цього немає, краще просто робити:

<TextView android:id="@+id/text_view_title" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content 
    android:text="FOO" 
    style="@style/RedHUGEText" />

Ви завжди можете мати це по-своєму!


4
Це встановить лише підмножину атрибутів, які можна визначити в <style>тегу. Це звичайні (розмір, колір, стиль), але не застосовує інших (включаючи підкладку, фон, гравітацію тощо)
karl

5
Здається, потрібен min API 23?
Вільям Т. Маллард

4
Є два методи: один для api <23 і один для api 23+. Вони здаються однаковими, за винятком того, що для <23 приймається контекстний аргумент, а для 23+ немає. Під капотом той, для api 23+, викликає метод для <23 та використовує контекст члена для перегляду тексту.
MrPlow


52

Ось так багато способів досягти цього завдання:

1.

String text_view_str = "<b>Bolded text</b>, <i>italic text</i>, even <u>underlined</u>!";
TextView tv = (TextView)findViewById(R.id.ur_text_view_id);
tv.setText(Html.fromHtml(text_view_str));

2.

tv.setTypeface(null, Typeface.BOLD);
tv.setTypeface(null, Typeface.ITALIC);
tv.setTypeface(null, Typeface.BOLD_ITALIC);
tv.setTypeface(null, Typeface.NORMAL);

3.

SpannableString spannablecontent=new SpannableString(o.content.toString());
spannablecontent.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 
                         0,spannablecontent.length(), 0);
// set Text here
tt.setText(spannablecontent);

4.

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

 tv.setTextAppearance(getApplicationContext(), R.style.boldText);

або якщо ви хочете через XML

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

setTextAppearance () - це відповідь, про яку я пішов, щоб застосувати користувацький стиль, визначений у моєму XML. Дякую.
ашаріо

На мою думку, це найкраща відповідь для теми. Багато варіантів програмного дзвінка в коді
Нгуен Мінь Хіен

9

Kotlin Version

Щоб зберегти поточний шрифт, крім стилю тексту:

textView.apply {
    setTypeface(typeface, Typeface.NORMAL)
    // or
    setTypeface(typeface, Typeface.BOLD)
    // or
    setTypeface(typeface, Typeface.ITALIC)
    // or
    setTypeface(typeface, Typeface.BOLD_ITALIC)
}

7

Це питання задають у багатьох місцях дуже різними способами. Я спочатку відповів на це тут, але вважаю, що це доречно і в цій темі (оскільки я опинився тут, коли шукав відповідь).

Немає жодного рядкового рішення цієї проблеми, але це спрацювало для мого використання. Проблема полягає в тому, що конструктор 'View (контекст, attrs, defStyle)' не посилається на власне стиль, він хоче атрибут. Отже, ми:

  1. Визначте атрибут
  2. Створіть стиль, який ви хочете використовувати
  3. Застосуйте стиль до цього атрибуту до нашої теми
  4. Створіть нові екземпляри нашого перегляду за допомогою цього атрибута

У 'res / values ​​/ attrs.xml' визначте новий атрибут:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="customTextViewStyle" format="reference"/>
    ...
</resources>    

У res / values ​​/ styles.xml 'Я збираюся створити стиль, який я хочу використовувати у своєму користувальницькому TextView

<style name="CustomTextView">
    <item name="android:textSize">18sp</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:paddingLeft">14dp</item>
</style>

У 'res / values ​​/ themes.xml' або 'res / values ​​/ styles.xml' змініть тему для свого додатка / діяльності та додайте наступний стиль:

<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <item name="@attr/customTextViewStyle">@style/CustomTextView</item>
    </style>
    ... 
</resources>

Нарешті, у вашому користувальницькому TextView тепер ви можете використовувати конструктор з атрибутом, і він отримає ваш стиль

public class CustomTextView extends TextView {

    public CustomTextView(Context context) {
       super(context, null, R.attr.customTextView);
    }
}

Варто відзначити, що я неодноразово використовував customTextView в різних варіантах і різних місцях, але ні в якому разі не потрібно, щоб назва перегляду відповідала стилю, атрибуту чи будь-чому. Також ця методика повинна працювати з будь-яким нестандартним поданням, а не лише з TextViews.


5

Це працювало для мене

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

або

textview.setTypeface(Typeface.DEFAULT_BOLD);

2

Я вирішив це двома простими методами.

Дотримуйтесь пояснення.

Моя існуюча декларація стилю:

<style name="SearchInfoText">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textSize">24sp</item>
    <item name="android:textColor">@color/Church_Grey</item>
    <item name="android:shadowColor">@color/Shadow_Church</item>
    <item name="android:shadowRadius">3</item>
    <item name="android:shadowDx">1</item>
    <item name="android:shadowDy">1</item>
</style>

Мій Java-код Java:

    TextView locationName = new TextView(getSupportActivity());
    locationName.setId(IdGenerator.generateViewId());
    locationName.setText(location.getName());
    locationName.setLayoutParams(super.centerHorizontal());
    locationName.setTextSize(24f);
    locationName.setPadding(0, 0, 0, 15);
    locationName.setTextColor(getResources().getColor(R.color.Church_Grey));
    locationName.setShadowLayer(3, 1, 1,  getResources().getColor(R.color.Shadow_Church));

З повагою


0

Ви можете спробувати цей

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                textView.setTextAppearance(R.style.Lato_Bold);
            } else {
                textView.setTextAppearance(getActivity(), R.style.Lato_Bold);
            }

0

Оскільки setTextAppearance(resId)доступний лише для API 23 і вище, використовуйте:

TextViewCompat.setTextAppearance(textViewGoesHere, resId)

Цей метод внутрішньо реалізується наступним чином:

public static void setTextAppearance(@NonNull TextView textView, @StyleRes int resId) {
    if (Build.VERSION.SDK_INT >= 23) {
        textView.setTextAppearance(resId);
    } else {
        textView.setTextAppearance(textView.getContext(), resId);
    }
}

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