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



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



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



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



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

671   10  

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

Edit:этой относится к контексту

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

для настройки конструктора стиля в представлении у нас есть 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_*.

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

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

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

третий параметр конструктора представления принимает тип 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-файле.

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

с уважением.

Comments

    Ничего не найдено.