如何以编程方式在视图中设置样式属性

我使用下面的代码从XML中获得一个视图:

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

我想设置一个“风格”的button,我怎么能做到这一点在java中,因为我想要使用每个button使用几个样式。

一般来说,你不能以编程方式改变样式; 您可以使用主题或样式在XML布局中设置屏幕的外观,布局的一部分或单个button。 然而,主题可以以编程方式应用 。

还有一个像StateListDrawable这样的事情,它可以让你定义你的Button可以处于的每个状态的不同的drawable,无论是聚焦,select,按下,禁用等等。

例如,要让button在按下时改变颜色,可以定义一个名为res/drawable/my_button.xml的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> 

然后,您可以通过设置属性android:background="@drawable/my_button"将此select器应用于Button

首先,你不需要使用布局inflater来创build一个简单的button。 你可以使用:

 button = new Button(context); 

如果你想对button进行devise,你有两个select:最简单的就是在代码中指定所有的元素,就像许多其他的答案一样:

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

另一种select是在XML中定义样式,并将其应用于button。 在一般情况下,你可以使用ContextThemeWrapperContextThemeWrapper这一点:

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

要更改TextView(或其子类,如Button)上与文本相关的属性,有一个特殊的方法:

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

最后一个不能用来改变所有的属性; 例如要更改填充,您需要使用ContextThemeWrapper 。 但是对于文本的颜色,大小等,你可以使用setTextAppearance

是的,你可以使用例如一个button

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

@Dayerman和@h_rules的答案是正确的。 为了给出一个详细的代码示例,在可绘制的文件夹中,创build一个名为button_disabled.xml的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); 

这会将button的属性设置为禁用,并将颜色设置为silverlight。

[颜色在color.xml中定义为:

 <resources> <color name="silver">#C0C0C0</color> </resources> 

对于任何正在寻找Material答案的人来说,看看这个SO贴子: 在Android中使用Material Design和AppCompat着色button

我使用了这个答案的组合button的默认文本颜色为白色为我的button: 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或一个AppCompatbutton,如果你愿意的话 – 我用两种types的buttontesting上述代码,它的工作原理。

编辑:我发现,前棒棒糖设备不能与上述代码一起工作。 看到这篇文章如何添加对棒棒糖设备的支持: 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); } 

在运行时,你知道你想要你的button的风格。 因此,事先在布局文件夹的xml中,您可以准备好所需的样式。 所以在布局文件夹中,可能有一个名为:button_style_1.xml的文件。 该文件的内容可能如下所示:

 <?xml version="1.0" encoding="utf-8"?> <Button android:id="@+id/styleOneButton" style="@style/FirstStyle" /> 

如果你正在使用片段,然后在onCreateView你膨胀该button,如:

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

其中容器是与您在创build片段时重写的onCreateView方法关联的ViewGroup容器。

还需要两个这样的button? 你可以这样创build它们:

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

您可以自定义这些button:

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

然后,将自定义的风格化button添加到在onCreateView方法中也膨胀的布局容器中:

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

这就是你可以dynamic地使用风格化的button。

你可以这样做风格属性:

 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" /> 

如果您正在使用支持库,则可以简单地使用

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

为TextViews和button。 其余的视图有类似的类:-)

我最近面临同样的问题。 这是我如何解决它。

 <?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); 

我发现这非常有帮助,因为它可以很容易地重用,并保持代码清洁和详细,我build议使用这只作为一个局部variables,所以我们可以让垃圾回收器完成它的工作,一旦我们完成设置所有样式。

如果有人需要颜色ButtonsRadioButtonCheckBox那就简单的使用

AppCompatButtonAppCompatRadioButtonAppCompatCheckBox

用简单的代码如:

button

  AppCompatButton b = new AppCompatButton(this); 

代替

  Button b = new Button(this); 

而对于单选button

  AppCompatRadioButton b = new AppCompatRadioButton(this); 

代替

  RadioButton b = new RadioButton(this); 

和checkbox

  AppCompatCheckBox b = new AppCompatCheckBox(this); 

代替

  CheckBox b= new CheckBox(this);