андроид установить стиль в коде
Я пытаюсь использовать конструктор 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);Edit:этой относится к контексту
вы можете пройти ContextThemeWrapper к конструктору вот так:
TextView myText = new TextView(new ContextThemeWrapper(MyActivity.this, R.style.my_style));
Вы можете установить стиль в конструкторе (но стили не могут быть динамически изменены/комплект).
View(Context, AttributeSet, int)(theintэто стиль ресурса)
динамическое изменение стилей не поддерживается (пока). Вы должны установить стиль до представление создается с помощью XML.
параметр int
defStyleAttrне определяет стиль. Из документации Android:defStyleAttr - атрибута в текущей теме, который содержит ссылка на ресурс стиля, который предоставляет значения по умолчанию для вид. Может быть 0, чтобы не искать по умолчанию.
для настройки конструктора стиля в представлении у нас есть 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_*.в этом случае все относительные свойства будьте готовы.
надеюсь, что это будет полезно для кого-то.
Я тоже столкнулся с этой проблемой, и я нашел способ программно установить стиль. Может быть, вам всем это нужно, поэтому я обновляю там.
третий параметр конструктора представления принимает тип 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