Android установить стиль в коде - PullRequest
237 голосов
/ 29 июня 2010

Я пытаюсь использовать конструктор TextView в таком стиле:

TextView myText = new TextView(MyActivity.this, null, R.style.my_style );

однако, когда я делаю это, текстовое представление не принимает стиль (я проверил стиль, установив его на статический объект).

Я также пытался использовать myText.setTextAppearance(MyActivity.this, R.style.my_style), но он также не работает

Ответы [ 10 ]

309 голосов
/ 30 марта 2011

Я не верю, что вы можете установить стиль программно. Чтобы обойти это, вы можете создать XML-файл макета шаблона с назначенным стилем, например, в res / layout создать файл tvtemplate.xml, как показано ниже:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="This is a template"
        style="@style/my_style" />

затем надуйте это, чтобы создать экземпляр вашего нового TextView:

TextView myText = (TextView)getLayoutInflater().inflate(R.layout.tvtemplate, null);

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

116 голосов
/ 05 октября 2012

Вы можете создать общий стиль и повторно использовать его в нескольких текстовых представлениях, как показано ниже:

textView.setTextAppearance(this, R.style.MyTextStyle);

Редактировать: это относится к контексту

92 голосов
/ 03 июля 2013

Вы можете передать ContextThemeWrapper в конструктор следующим образом:

TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));
16 голосов
/ 19 февраля 2013

Вы можете установить стиль в конструкторе (но стили не могут быть динамически изменены / установлены).

View(Context, AttributeSet, int) (int является ресурсом стиля)

Ответ от Romain Guy

ссылка

8 голосов
/ 05 февраля 2017

Параметр int defStyleAttr не определяет стиль.Из документации Android:

defStyleAttr - Атрибут в текущей теме, содержащий ссылку на ресурс стиля, который предоставляет значения по умолчанию для представления.Может быть 0, чтобы не искать значения по умолчанию.

Для настройки стиля в конструкторе View у нас есть 2 возможных решения:

  1. При использовании ContextThemeWrapper:

    ContextThemeWrapper wrappedContext = new ContextThemeWrapper(yourContext, R.style.your_style);
    TextView textView = new TextView(wrappedContext, null, 0);
    
  2. С конструктором с четырьмя аргументами (доступно начиная с LOLLIPOP):

    TextView textView = new TextView(yourContext, null, 0, R.style.your_style);
    

Ключевая вещь для обоихрешения - параметр defStyleAttr должен быть равен 0, чтобы применить наш стиль к представлению.

5 голосов
/ 30 марта 2011

Динамическое изменение стилей не поддерживается (пока). Вы должны установить стиль до того, как представление будет создано через XML.

2 голосов
/ 10 апреля 2015

Принятый ответ стал для меня отличным решением.Единственное, что нужно добавить, это метод inflate().

В принятом ответе все параметры android:layout_* не будут применены.

Причина не в том, чтобы отрегулировать его, потому что null был передан как ViewGroup parent.

Вы можете использовать его так:

View view = inflater.inflate(R.layout.view, parent, false);

и parent - это ViewGroup, откуда вы хотите настроить android:layout_*.

В этом случае будут установлены все относительные свойства.

Надеюсь, это кому-нибудь пригодится.

2 голосов
/ 11 января 2014

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

public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs, attrs.getStyleAttribute());
}
1 голос
/ 17 октября 2016

Я тоже столкнулся с проблемой и нашел способ задавать стиль программно.Может быть, вам все это нужно, поэтому я обновляюсь там.

Третий параметр конструктора View принимает тип attr в вашей теме в качестве исходного кода ниже:

public TextView(Context context, AttributeSet attrs) {
    this(context, attrs, com.android.internal.R.attr.textViewStyle);
}

Итак, вы должны передатьтип R.attr. **, а не R.style. **

В своих кодах я сделал следующие шаги:

Сначала настройте настраиваемый атрибут, который будет использоваться темами вattr.xml.

<attr name="radio_button_style" format="reference" />

Во-вторых, укажите свой стиль в используемой теме в style.xml.

 <style name="AppTheme" parent="android:Theme.Translucent">
    <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    <item name="radio_button_style">@style/radioButtonStyle</item>
</style>
<style name="radioButtonStyle" parent="@android:style/Widget.CompoundButton.RadioButton">
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">64dp</item>
    <item name="android:background">#000</item>
    <item name="android:button">@null</item>
    <item name="android:gravity">center</item>
    <item name="android:saveEnabled">false</item>
    <item name="android:textColor">@drawable/option_text_color</item>
    <item name="android:textSize">9sp</item>
</style>

В конце используйте его!

            RadioButton radioButton = new RadioButton(mContext, null, R.attr.radio_button_style);

представление, созданное программно, будет использовать указанный стиль в вашей теме.

Вы можете попробовать и надеяться, что он отлично сработает.

0 голосов
/ 11 июля 2012

Я тестировал только с EditText, но вы можете использовать метод

public void setBackgroundResource (int остаток)

для применения стиля, определенного в файле XML.

Если этот метод принадлежит View, я думаю, он будет работать с любым элементом пользовательского интерфейса.

привет.

...