如何以编程方式在视图中设置样式属性
我使用下面的代码从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。 在一般情况下,你可以使用ContextThemeWrapper
来ContextThemeWrapper
这一点:
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,所以我们可以让垃圾回收器完成它的工作,一旦我们完成设置所有样式。
如果有人需要颜色Buttons
或RadioButton
或CheckBox
那就简单的使用
AppCompatButton
或AppCompatRadioButton
或AppCompatCheckBox
用简单的代码如:
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);