Стиль андроида в коде

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

Вы можете передать ContextThemeWrapper конструктору, подобному этому:

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

Ответ 4

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

View(Context, AttributeSet, int) (int - ресурс стиля)

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

reference

Ответ 5

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

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

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

  • С помощью ContextThemeWrapper:

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

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

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

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

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

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

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

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

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

Ответ 9

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

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

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

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

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

Сначала настройте настраиваемый attr, который будет использоваться темами в 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);

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

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

Ответ 10

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

public void setBackgroundResource (int resid)

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

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

С уважением.

Ответ 11

Мы можем использовать TextViewCompact.setTextAppearance(textView, R.style.xyz).

Android документ для справки.