Как применить стиль программно?

У меня есть стили, называемые Red и Green, и у меня есть stat, чтобы узнать, что применять, но я не знаю, какой код действительно применять стиль из java.

Ответ 1

Я узнал, что это можно сделать только при создании представления изнутри Java. Если он определен в XML перед рукой, вы не можете динамически изменять стиль.

Ответ 2

Нет ни одного решения этой проблемы, но это сработало для моего использования. Проблема заключается в том, что конструктор "View (context, attrs, defStyle)" не ссылается на фактический стиль, он хочет получить атрибут. Итак, мы будем:

  • Определить атрибут
  • Создайте стиль, который вы хотите использовать
  • Применить стиль для этого атрибута в нашей теме
  • Создайте новые экземпляры нашего представления с этим атрибутом

В 'res/values ​​/attrs.xml' определите новый атрибут:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="customTextViewStyle" format="reference"/>
    ...
</resources>    

В res/values ​​/styles.xml "Я собираюсь создать стиль, который я хочу использовать в своем пользовательском TextView

<style name="CustomTextView">
    <item name="android:textSize">18sp</item>
    <item name="android:textColor">@color/white</item>
    <item name="android:paddingLeft">14dp</item>
</style>

В 'res/values ​​/themes.xml' или 'res/values ​​/styles.xml' измените тему для вашего приложения/действия и добавьте следующий стиль:

<resources>
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <item name="@attr/customTextViewStyle">@style/CustomTextView</item>
    </style>
    ... 
</resources>

Наконец, в вашем пользовательском TextView вы можете теперь использовать конструктор с атрибутом, и он получит ваш стиль. Здесь, а не всегда

public class CustomTextView extends TextView {

    public CustomTextView(Context context, int styleAttribute) {
        super(context, null, styleAttribute);
    }

    // You could also just apply your default style if none is given
    public CustomTextView(Context context) {
        super(context, null, R.attr.customTextViewStyle);
    }
}

Со всеми этими компонентами теперь вы можете сделать оператор if/else для генерации новых представлений во время выполнения с помощью стиля, который вы предпочитаете

CustomTextView ctv;
if(useCustomStyles == true){
    ctv = new CustomTextView(context, R.attr.customTextViewStyle);
}else{
    ctv = new CustomTextView(context, R.attr.someOtherStyle);
}

Стоит отметить, что я неоднократно использовал customTextView в разных вариантах и ​​разных местах, но отнюдь не требуется, чтобы имя представления соответствовало стилю или атрибуту или чему-либо еще. Кроме того, этот метод должен работать с любым пользовательским представлением, а не только с TextViews.

Ответ 3

Можно применять стили программно к TextViews с помощью метода setTextAppearance (контекст, вычет). (ResID стиля можно найти в R.style.YourStyleName)

Ответ 4

введите этот код

super.setStyle(R.style.yourownstyle)

перед установкой SetContentView() в onCreate