Стиль андроида в коде
Я пытаюсь использовать конструктор 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 документ для справки.