Button view = (Button) LayoutInflater.from(this).inflate(R.layout.section_button, null);
我想为按钮设置“样式”,如何在Java中做到因为我想为每个按钮使用几种样式。
#1 楼
通常,您无法以编程方式更改样式;您可以使用主题或样式来设置屏幕的外观,部分布局或XML布局中的单个按钮的外观。但是,可以通过编程方式应用主题。还有诸如
StateListDrawable
之类的东西,它使您可以为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>
然后可以通过设置属性
Button
将此选择器应用于android:background="@drawable/my_button"
。#2 楼
首先,您不需要使用布局填充器来创建简单的Button。您可以使用:button = new Button(context);
如果要设置按钮的样式,则有两种选择:最简单的一种是只指定代码中的所有元素,就像许多其他答案建议:
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);
这最后一个不能用来更改所有属性;例如,要更改填充,您需要使用
ContextThemeWrapper
。但是对于文本颜色,大小等,您可以使用setTextAppearance
。评论
真是太好了。 ContextThemeWrapper-是我一直以来一直在寻找的东西。
–阿亚兹·阿里夫(Ayaz Alifov)
16-10-24在15:15
这很棒。一直在寻找这种解决方案。
– Jasonjwwilliams
18年3月22日在1:50
#3 楼
是的,您可以在按钮中使用Button b = new Button(this);
b.setBackgroundResource(R.drawable.selector_test);
评论
这将设置背景,但是样式可以指定的不仅仅是背景。许多视图(包括Button)似乎都有一个将样式ID作为参数的构造函数。但是,我在为我工作时遇到了问题-该按钮显示为无边框或任何文字的文本。我可能要做的是创建一个仅带有按钮的布局(指定了样式),对布局进行充气,然后设置按钮文本以及其他内容。
–spaaarky21
2013年1月31日17:43
#4 楼
您可以这样设置样式属性: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"
/>
评论
应创建考虑按钮的良好答案。很高兴看到如何对现有按钮执行此操作。
–质量催化剂
17 Mar 4 '17 at 4:32
请参阅cesards的答案。
–克里斯蒂·威尔士(Kristy Welsh)
17年3月4日在15:08
#5 楼
如果使用支持库,则可以简单地将TextViewCompat.setTextAppearance(textView, R.style.AppTheme_TextStyle_ButtonDefault_Whatever);
用于TextViews和Buttons。其余视图也有类似的类:-)
评论
您需要使用哪个R包来获得此样式?
– htafoya
3月12日18:58
#6 楼
对于任何寻求“材料”答案的人,请参见以下SO帖子:带有Material Design和AppCompat的Android中的着色按钮我结合使用了该答案,将按钮的默认文本颜色设置为白色:
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按钮-如果您愿意,我用两种类型的按钮测试了上述代码编辑:我发现棒棒糖之前的设备无法与上述代码一起使用。有关如何添加对棒棒糖设备的支持的信息,请参阅此帖子:https://stackoverflow.com/a/30277424/3075340
基本上是这样做的: />
#7 楼
根据您要更改的样式属性,您可以使用Paris库:受支持。当前支持的属性列表
安装说明
免责声明:我编写了该库。
#8 楼
@Dayerman和@h_rules的答案是正确的。要给出带有代码的详细示例,
在drawable文件夹中,创建一个名为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>
br />
((Button) findViewById(R.id.my_button)).setEnabled(false);
((Button) findViewById(R.id.my_button)).setBackgroundResource(R.drawable.button_disabled);
这会将按钮的属性设置为禁用,并将颜色设置为银色。
[color.xml中将颜色定义为:
<resources>
<color name="silver">#C0C0C0</color>
</resources>
评论
@Pacerier:问题根本没有说明。样式是XML还是Java都是模棱两可的。它仅询问如何以编程方式设置样式。
–哈维
2014年11月19日15:21
#9 楼
在运行时,您知道希望按钮具有哪种样式。因此,事前,在布局文件夹中的xml中,您可以使用所需样式来准备好所有按钮。因此,在布局文件夹中,您可能有一个名为:button_style_1.xml的文件。该文件的内容可能看起来像: ><?xml version="1.0" encoding="utf-8"?>
<Button
android:id="@+id/styleOneButton"
style="@style/FirstStyle" />
其中容器是与创建片段时覆盖的onCreateView方法关联的ViewGroup容器。
还需要两个这样的按钮吗?您可以这样创建它们:
Button firstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
您可以自定义这些按钮:
Button secondFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
Button thirdFirstStyleBtn = (Button) inflater.inflate(R.layout.button_style_1, container, false);
然后添加您的自定义的样式化按钮,也可以在onCreateView方法中对布局容器进行充气:
#10 楼
我使用holder模式为此创建了一个辅助接口。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);
我发现这很有帮助因为它可以轻松地重用并保持代码整洁和冗长,所以我建议仅将此变量用作局部变量,这样一旦设置完所有样式,我们就可以允许垃圾收集器完成其工作。
#11 楼
我最近遇到了同样的问题。这就是我的解决方法。<?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%(宽度和高度))
最后,我给了两个子元素不同的背景色,以产生最终效果。
谢谢!
评论
我的问题是我从Web服务加载了描述我的按钮信息的数据。这些按钮需要根据其所属的类别具有不同的样式。这就是为什么我想动态设置样式。
– Lint_
10年7月7日在8:42
好吧,您不能更改Android样式属性,但是可以通过编程方式设置Button的背景,就像在其他任何视图中一样。另外,由于Button继承自TextView,因此可以更改文本属性。只需查看这些项目的API文档即可...developer.android.com/reference/android/view/…
–克里斯托弗·奥尔(Christopher Orr)
2010年1月7日15:12
在检查我是否有新答案之前,我只是在考虑这样做。非常感谢。
– Lint_
2010年1月7日在20:12
是否无法为按钮创建样式来定义文本大小,边距等,然后以编程方式将其应用于按钮。如果我有六个想要具有相同样式的按钮,肯定可以说吗?
–熊
2012年1月7日在2:30
我们可以提高哪个属性?我们可以增加边距,填充吗?
–甘兰·马吉德(Kamran Majeed)
15年1月21日在11:05