стиль набора 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 возможных решения:
-
С использованием 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, чтобы применить наш стиль к представлению.
при использовании пользовательских представлений, которые могут использовать наследование стиля (или атрибуты события 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.
с уважением.