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

Я получаю представление из 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 

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

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