Android - установить TextView TextStyle программно? - PullRequest
196 голосов
/ 27 октября 2011

Есть ли способ установить атрибут 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" />

Ответы [ 9 ]

349 голосов
/ 27 октября 2011
textview.setTypeface(Typeface.DEFAULT_BOLD);

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

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

textview.setTypeface(textview.getTypeface(), Typeface.BOLD);
110 голосов
/ 24 августа 2012

Допустим, у вас есть стиль 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 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 без проблем.

Помните ... это полезно, только если стильтекст на самом деле зависит от условий вашей логики Java, или вы создаете пользовательский интерфейс «на лету» с помощью кода ... если это не так, лучше просто сделать:

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

Вывсегда может быть по-своему!

Надеюсь, это поможет!

59 голосов
/ 27 октября 2011

Поиск setTextAppearance или также setTextTypeface. Существует аналогичный вопрос по stackoverflow: Как изменить стиль TextView во время выполнения

48 голосов
/ 12 июля 2013

Существует множество способов решения этой задачи. Некоторые из них приведены ниже: -

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"
7 голосов
/ 30 октября 2013

Этот вопрос задают во многих местах множеством разных способов.Первоначально я ответил на это здесь, но я чувствую, что это актуально и в этой теме (так как я закончил здесь , когда я искал ответ).

Нет единственного решения этой проблемыпроблема, но это сработало для моего варианта использования.Проблема в том, что конструктор 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 голосов
/ 29 сентября 2018

Kotlin Version

Чтобы сохранить текущий шрифт в дополнение к стилю текста:

textView.apply {
    setTypeface(typeface, Typeface.NORMAL)
    // or
    setTypeface(typeface, Typeface.BOLD)
    // or
    setTypeface(typeface, Typeface.ITALIC)
    // or
    setTypeface(typeface, Typeface.BOLD_ITALIC)
}
4 голосов
/ 13 июля 2016

Это сработало для меня

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

или

textview.setTypeface(Typeface.DEFAULT_BOLD);
2 голосов
/ 24 июня 2013

Я решил это двумя простыми методами.

Следуйте объяснениям.

Моя существующая декларация стиля:

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

Привет.

0 голосов
/ 27 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...