Как программно установить атрибут стиля в представлении

Я получаю представление из XML с помощью кода ниже:

Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null); 

Я хотел бы установить «стиль» для кнопки, как я могу это сделать в java, так как хочу использовать несколько стилей для каждой кнопки, которую я буду использовать.

    11 Solutions collect form web for “Как программно установить атрибут стиля в представлении”

    Как правило, вы не можете изменять стили программно; вы можете установить внешний вид экрана или часть макета или отдельную кнопку в вашем XML-макете с помощью тем или стилей . Тем не менее, темы могут применяться программно .

    Существует также такая вещь, как StateListDrawable которая позволяет вам определять различные чертежи для каждого состояния, в котором может находиться ваша Button , будь то сфокусированная, выбранная, нажатая, отключенная и так далее.

    Например, чтобы ваша кнопка изменила цвет при нажатии, вы можете определить XML-файл с именем res/drawable/my_button.xml например:

     < ?xml version="1.0" encoding="utf-8"?>     

    Затем вы можете применить этот селектор к Button , установив свойство android:background="@drawable/my_button" .

    Прежде всего, вам не нужно использовать макет надувной подушки для создания простой кнопки. Вы можете просто использовать:

     button = new Button(context); 

    Если вы хотите стилизовать кнопку, у вас есть 2 варианта: самый простой – просто указать все элементы в коде, как и многие другие ответы:

     button.setTextColor(Color.RED); button.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); 

    Другой вариант – определить стиль в XML и применить его к кнопке. В общем случае вы можете использовать ContextThemeWrapper для этого:

     ContextThemeWrapper newContext = new ContextThemeWrapper(baseContext, R.style.MyStyle); button = new Button(newContext); 

    Чтобы изменить атрибуты, связанные с текстом, в TextView (или его подclassах, например Button), существует специальный метод:

     button.setTextAppearance(context, R.style.MyTextStyle); 

    Этот последний нельзя использовать для изменения всех атрибутов; например, чтобы изменить ContextThemeWrapper вам нужно использовать ContextThemeWrapper . Но для цвета текста, размера и т. Д. Вы можете использовать setTextAppearance .

    Да, вы можете использовать, например, кнопку

     Button b = new Button(this); b.setBackgroundResource(R.drawable.selector_test); 

    Для тех, кто ищет материальный ответ, см. Это сообщение SO: Цветные кнопки в Android с материальным дизайном и AppCompat

    Я использовал комбинацию этого ответа, чтобы установить цвет текста по умолчанию для кнопки «белый» для моей кнопки: https://stackoverflow.com/a/32238489/3075340

    Затем ответьте https://stackoverflow.com/a/34355919/3075340, чтобы программно установить цвет фона. Код для этого:

     ViewCompat.setBackgroundTintList(your_colored_button, ContextCompat.getColorStateList(getContext(),R.color.your_custom_color)); 

    your_colored_button может быть просто обычной Button или кнопкой AppCompat, если хотите – я тестировал вышеуказанный код с помощью обоих типов кнопок, и он работает.

    EDIT: Я обнаружил, что устройства pre-lollipop не работают с вышеуказанным кодом. См. Это сообщение о том, как добавить поддержку для устройств с предварительным лечением: https://stackoverflow.com/a/30277424/3075340

    В основном это:

     Button b = (Button) findViewById(R.id.button); ColorStateList c = ContextCompat.getColorStateList(mContext, R.color.your_custom_color; Drawable d = b.getBackground(); if (b instanceof AppCompatButton) { // appcompat button replaces tint of its drawable background ((AppCompatButton)b).setSupportBackgroundTintList(c); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // Lollipop button replaces tint of its drawable background // however it is not equal to d.setTintList(c) b.setBackgroundTintList(c); } else { // this should only happen if // * manually creating a Button instead of AppCompatButton // * LayoutInflater did not translate a Button to AppCompatButton d = DrawableCompat.wrap(d); DrawableCompat.setTintList(d, c); b.setBackgroundDrawable(d); } 

    Ответ @Dayerman и @h_rules прав. Чтобы дать продуманный пример с кодом, в папке с возможностью рисования создайте файл xml с именем button_disabled.xml

     < ?xml version="1.0" encoding="utf-8"?>     

    Затем в Java,

     ((Button) findViewById(R.id.my_button)).setEnabled(false); ((Button) findViewById(R.id.my_button)).setBackgroundResource(R.drawable.button_disabled); 

    Это позволит отключить свойство кнопки и установить цвет в серебристый.

    [Цвет определен в color.xml как:

      #C0C0C0  

    Вы можете сделать атрибуты стиля следующим образом:

     Button myButton = new Button(this, null,android.R.attr.buttonBarButtonStyle); 

    на месте:

      

    Во время выполнения вы знаете, какой стиль вам нужен для вашей кнопки. Поэтому заранее, в xml в папке макета, вы можете иметь все готовые кнопки со стилями, которые вам нужны. Поэтому в папке макета может быть файл с именем: button_style_1.xml. Содержимое этого файла может выглядеть так:

     < ?xml version="1.0" encoding="utf-8"?>  

    Если вы работаете с fragmentами, то в onCreateView вы надуваете эту кнопку, например:

     Button firstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false); 

    где контейнер – контейнер ViewGroup, связанный с методом onCreateView, который вы переопределяете при создании вашего fragmentа.

    Нужны еще две такие кнопки? Вы создаете их следующим образом:

     Button secondFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false); Button thirdFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false); 

    Вы можете настроить эти кнопки:

     secondFirstStyleBtn.setText("My Second"); thirdFirstStyleBtn.setText("My Third"); 

    Затем вы добавляете свои настраиваемые стилизованные кнопки в контейнер макета, который также раздувается в методе onCreateView:

     _stylizedButtonsContainer = (LinearLayout) rootView.findViewById(R.id.stylizedButtonsContainer); _stylizedButtonsContainer.addView(firstStyleBtn); _stylizedButtonsContainer.addView(secondFirstStyleBtn); _stylizedButtonsContainer.addView(thirdFirstStyleBtn); 

    И именно так вы можете динамически работать со стилизованными кнопками.

    В зависимости от того, какие атрибуты стиля вы хотели бы изменить, вы сможете использовать библиотеку Парижа:

     Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null); Paris.style(view).apply(R.style.YourStyle); 

    Поддерживаются многие атрибуты, такие как background, padding, textSize, textColor и т. Д.

    • Список поддерживаемых в настоящее время атрибутов
    • Инструкция по установке

    Отказ от ответственности: я создал библиотеку.

    Если вы используете библиотеку Support, вы можете просто использовать

     TextViewCompat.setTextAppearance(getContext(), R.style.AppTheme_TextStyle_ButtonDefault_Whatever); 

    для TextViews и кнопок. Есть аналогичные classы для остальных видов 🙂

    Недавно я столкнулся с такой же проблемой. вот как я решил это.

     < ?xml version="1.0" encoding="utf-8"?>          
    • Я использовал LinearLayout с Android: weightSum = “2”
    • Я дал двум дочерним элементам android: layout_weight = “1” (я дал каждому 50% родительского пространства (ширина и высота))
    • И, наконец, я дал двум дочерним элементам разные цвета фона, чтобы иметь окончательный эффект.

    Благодаря !

    Я сделал вспомогательный интерфейс для этого, используя шаблон держателя.

     public interface StyleHolder { void applyStyle(V view); } 

    Теперь для каждого стиля, который вы хотите использовать прагматично, просто реализуйте интерфейс, например:

     public class ButtonStyleHolder implements StyleHolder 

    Объявите стиль в вашем attrs.xml , стиль для этого примера:

          

    Вот стиль, объявленный в styles.xml :

      

    И, наконец, реализация стиля:

     Button btn = new Button(context); StyleHolder 

    Я нашел это очень полезным, так как его можно легко использовать повторно, и он сохраняет код чистым и подробным, я бы рекомендовал использовать его только как локальную переменную, чтобы мы могли позволить сборщику мусора выполнять свою работу после того, как мы закончим настройку всех стилей ,

    Interesting Posts
    Давайте будем гением компьютера.