Как программно установить атрибут стиля в виде
Я получаю представление из XML с кодом ниже:
Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null);
Я хотел бы установить "стиль" для кнопки как я могу это сделать в java, так как хочу использовать несколько стилей для каждой кнопки, которую я буду использовать.
11 ответов:
как правило, вы не можете изменить стили программно; вы можете установить внешний вид экрана или части макета или отдельной кнопки в вашем XML-макете с помощью темы и стили. Темы могут, однако, применяется программно.
существует также такая вещь, как
StateListDrawable
который позволяет определить различные чертежи для каждого состояния вашButton
может быть внутри, ли сфокусированный, выбранный, отжатый, отключенный и так далее на.например, чтобы заставить вашу кнопку Изменить цвет при нажатии, вы можете определить XML-файл с именем такой:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@drawable/btn_pressed" /> <item android:state_pressed="false" android:drawable="@drawable/btn_normal" /> </selector>
затем вы можете применить этот селектор к
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);
To изменение текстовых атрибутов в TextView (или его подклассах, таких как Button) существует специальный метод:
button.setTextAppearance(context, R.style.MyTextStyle);
этот последний не может быть использован для изменения всех атрибутов, например, чтобы изменить отступы нужно использовать
ContextThemeWrapper
. Но для цвета текста, размера и т. д. вы можете использоватьsetTextAppearance
.
Да, вы можете использовать, например, на кнопку
Button b = new Button(this); b.setBackgroundResource(R.drawable.selector_test);
для тех, кто ищет материальный ответ см. Этот пост SO:кнопки раскраски на Андроид с материальной конструкции и совместимости приложений
я использовал комбинацию этого ответа, чтобы установить цвет текста по умолчанию кнопки на белый для моей кнопки: 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 не работают с приведенным выше кодом. См. этот пост о том, как добавить поддержку для устройств 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 является правильным. Чтобы дать подробный пример с кодом, В папке drawable создайте xml-файл с именем button_disabled.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" android:padding="10dp"> <solid android:color="@color/silver"/> <corners android:bottomRightRadius="20dp" android:bottomLeftRadius="20dp" android:topLeftRadius="20dp" android:topRightRadius="20dp"/> </shape>
затем в Java,
((Button) findViewById(R.id.my_button)).setEnabled(false); ((Button) findViewById(R.id.my_button)).setBackgroundResource(R.drawable.button_disabled);
это установит свойство кнопки отключено и установит цвет в серебро.
[цвет определяется по цвету.xml как:
<resources> <color name="silver">#C0C0C0</color> </resources>
вы можете сделать атрибуты стиля так:
Button myButton = new Button(this, null,android.R.attr.buttonBarButtonStyle);
на месте:
<Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/btn" style="?android:attr/buttonBarButtonStyle" />
во время выполнения, вы знаете, какой стиль вы хотите, чтобы ваши кнопки, чтобы иметь. Поэтому заранее, в xml в папке макета, вы можете иметь все готовые кнопки со стилями, которые вам нужны. Таким образом, в папке макета у вас может быть файл с именем: button_style_1.XML. Содержимое этого файла может выглядеть так:
<?xml version="1.0" encoding="utf-8"?> <Button android:id="@+id/styleOneButton" style="@style/FirstStyle" />
если вы работаете с фрагментами, то в onCreateView вы надуваете эту кнопку, например:
Button firstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
где контейнер-это контейнер ViewGroup, связанный с метод onCreateView, который вы переопределяете при создании фрагмента.
нужны еще две такие кнопки? Вы создаете их так:
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);
и вот как вы можете динамически работать со стилизованными кнопками.
в зависимости от того, какие атрибуты стиля вы хотите изменить, Вы можете использовать библиотеку Paris:
Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null); Paris.style(view).apply(R.style.YourStyle);
многие атрибуты, такие как фон, заполнение, textSize, textColor и т. д. поддерживаются.
отказ от ответственности: я создал библиотеку.
Если вы используете библиотеку, вы могли бы просто использовать
TextViewCompat.setTextAppearance(getContext(), R.style.AppTheme_TextStyle_ButtonDefault_Whatever);
для просмотра текста и кнопок. Существуют аналогичные классы для остальных представлений : -)
я столкнулся с той же проблемой. вот как я это решил.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <!-- This is the special two colors background START , after this LinearLayout, you can add all view that have it for main background--> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:weightSum="2" android:background="#FFFFFF" android:orientation="horizontal" > <View android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="#0000FF" /> <View android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:background="#F000F0" /> </LinearLayout> <!-- This is the special two colors background END--> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:text="This Text is centered with a special backgound, You can add as much elements as you want as child of this RelativeLayout" android:textColor="#FFFFFF" android:textSize="20sp" /> </RelativeLayout>
- Я использовал LinearLayout с android:weightSum= "2"
- Я дал два дочерних элемента android:layout_weight= " 1" (Я дал каждому 50% родительского пространства (ширина и высота))
- и наконец, я дал два ребенка разных цветов фона, чтобы иметь окончательного влияния.
спасибо !
Я сделал вспомогательный интерфейс для этого, используя шаблон держатель.
public interface StyleHolder<V extends View> { void applyStyle(V view); }
теперь для каждого стиля, который вы хотите использовать прагматично просто реализовать интерфейс, например:
public class ButtonStyleHolder implements StyleHolder<Button> { private final Drawable background; private final ColorStateList textColor; private final int textSize; public ButtonStyleHolder(Context context) { TypedArray ta = context.obtainStyledAttributes(R.style.button, R.styleable.ButtonStyleHolder); Resources resources = context.getResources(); background = ta.getDrawable(ta.getIndex(R.styleable.ButtonStyleHolder_android_background)); textColor = ta.getColorStateList(ta.getIndex(R.styleable.ButtonStyleHolder_android_textColor)); textSize = ta.getDimensionPixelSize( ta.getIndex(R.styleable.ButtonStyleHolder_android_textSize), resources.getDimensionPixelSize(R.dimen.standard_text_size) ); // Don't forget to recycle! ta.recycle(); } @Override public void applyStyle(Button btn) { btn.setBackground(background); btn.setTextColor(textColor); btn.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); } }
объявите стилизуемый в вашем
attrs.xml
, стиль для этого примера:<declare-styleable name="ButtonStyleHolder"> <attr name="android:background" /> <attr name="android:textSize" /> <attr name="android:textColor" /> </declare-styleable>
вот стиль, объявленный в
styles.xml
:<style name="button"> <item name="android:background">@drawable/button</item> <item name="android:textColor">@color/light_text_color</item> <item name="android:textSize">@dimen/standard_text_size</item> </style>
и, наконец, реализация держателя стиль:
Button btn = new Button(context); StyleHolder<Button> styleHolder = new ButtonStyleHolder(context); styleHolder.applyStyle(btn);
Я нашел это очень полезным, как это может легко использовать повторно и сохраняет код чистым и подробным, я бы рекомендовал использовать это только как локальную переменную, чтобы мы могли позволить сборщику мусора выполнять свою работу, как только мы закончим с настройкой всех стилей.