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
Вы можете сослаться на ссылку ниже и заблокировать
первый
Пожалуйста, проверьте мой ответ здесь . Надеюсь, что это поможет вам
Summved Jain

Ответы:

410
textview.setTypeface(Typeface.DEFAULT_BOLD);

setTypeface является атрибутом textStyle.

Как добавил Шанкар V , для сохранения ранее установленных атрибутов гарнитуры вы можете использовать:

textview.setTypeface(textview.getTypeface(), Typeface.BOLD);
Raz
источник
14
это должно бытьtextview.setTypeface(textview.getTypeface(), Typeface.DEFAULT_BOLD);
Sankar V
2
@IlyaEremin Чтобы сохранить ранее установленный шрифт, вы должны использовать его следующим образом.
Санкар V
Отредактировал мой ответ на основе комментария @SankarV.
Раз
13
Я думаю, что вы должны потерять DEFAULT: holder.title.setTypeface (holder.title.getTypeface (), Typeface.BOLD);
Иман Акбари
На самом деле textview.getTypeface().getStyle()этоandroid:textStyle
Pierre
126

Допустим, у вас есть стиль RedHUGEText в вашем values ​​/ 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 layout / 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);

Это сработало для меня! И он применял цвет, размер, гравитацию и т. Д. Я использовал его на мобильных телефонах и планшетах с уровнями API Android от 8 до 17 без проблем. Обратите внимание, что с Android 23 этот метод устарел. Аргумент context был отброшен, поэтому последняя строка должна быть:

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>теге. Он выполняет общие (размер, цвет, стиль), но не применяет другие (включая отступы, фон, гравитацию и т. Д.)
Карл
5
Кажется, требуется минимум API 23?
Уильям Т. Маллард
4
Есть два метода, один для api <23, и один для api 23+. Они выглядят идентичными, за исключением того, что для <23 принимается контекстный аргумент, а для 23+ - нет. Под капотом тот, что для api 23+, вызывает метод для <23 и использует контекст элемента для просмотра текста.
MrPlow
53

Так много способов для достижения этой задачи некоторые из них ниже:

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 (context, 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>

Мой Android 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));

С уважением.

andresmafra
источник
0

Вы можете попробовать это

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                textView.setTextAppearance(R.style.Lato_Bold);
            } else {
                textView.setTextAppearance(getActivity(), R.style.Lato_Bold);
            }
insane_warewolf
источник
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);
    }
}
Рохан Танеджа
источник
-1

Как уже упоминалось здесь , эта функция не поддерживается.

dcanh121
источник