стиль набора android в коде

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

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

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

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

10 ответов


Я не верю, что вы можете установить стиль программно. Чтобы обойти это, вы можете создать xml-файл макета шаблона с назначенным стилем, например, в res/layout create 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);

надеюсь, что это помогает.


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

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

изменить: этой относится к контексту


вы можете пройти ContextThemeWrapper конструктор такой:

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

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

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

ответ от Ромена Гая

ссылка


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


параметр 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, чтобы применить наш стиль к представлению.


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

public CustomView(Context context, AttributeSet attrs) {
    this(context, attrs, attrs.getStyleAttribute());
}

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

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

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

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

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

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

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

надеюсь, что это будет полезно для кого-то.


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

третий конструктор param вида принимает тип 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" />

во-вторых, укажите свой стиль в используемой теме в стиле.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);

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

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


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

public void setBackgroundResource (int resid)

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

синус этот метод принадлежит View я считаю, что он будет работать с любым элементом UI.

с уважением.