Android установить стиль в коде
Я пытаюсь использовать конструктор TextView со стилем, как это:
TextView myText = new TextView(MyActivity.this, null, R.style.my_style );
однако, когда я делаю это, текстовое представление, кажется, не принимает стиль (я проверил стиль, установив его на статический объект).
Я также пытался использовать myText.setTextAppearance(MyActivity.this, R.style.my_style)
но это тоже не работает
13 ответов
Я не верю, что вы можете установить стиль программно. Чтобы обойти это, вы можете создать 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);
Надеюсь это поможет.
Вы можете создать общий стиль и повторно использовать его в нескольких текстовых представлениях, как показано ниже:
textView.setTextAppearance(this, R.style.MyTextStyle);
Изменить: это относится к контексту
Вы можете передать ContextThemeWrapper в конструктор следующим образом:
TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));
Вы можете установить стиль в конструкторе (но стили не могут быть динамически изменены / установлены).
View(Context, AttributeSet, int)
(int
это ресурс стиля)
Параметр 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, чтобы применить наш стиль к представлению.
Динамическое изменение стилей не поддерживается (пока). Вы должны установить стиль до того, как представление будет создано через XML.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
textView.setTextAppearance(R.style.yourStyle)
Я тоже столкнулся с проблемой и нашел способ задавать стиль программно. Может быть, вам всем это нужно, поэтому я обновляюсь там.
Третий параметр конструктора 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);
представление, созданное программно, будет использовать указанный стиль в вашей теме.
Вы можете попробовать, и надеюсь, что это сработает для вас отлично.
Мы можем использовать TextViewCompact.setTextAppearance(textView, R.style.xyz)
.
Документация по Android для справки.
При использовании пользовательских представлений, которые могут использовать наследование стилей (или атрибуты стиля событий), вы должны изменить второй конструктор, чтобы не потерять стиль. Это сработало для меня, без необходимости использовать 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_*
,
В этом случае все относительные свойства будут установлены.
Надеюсь, это будет кому-то полезно.
вы можете использовать функции расширения kotlin
fun TextView.setStyle(@StyleRes resId: Int) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
setTextAppearance(resId)
} else {
setTextAppearance(context, resId)
}
}
Я тестировал только с EditText, но вы можете использовать метод
public void setBackgroundResource (int остаток)
применить стиль, определенный в файле XML.
Так как этот метод принадлежит View, я думаю, он будет работать с любым элементом пользовательского интерфейса.
С уважением.