如果要设置按钮的样式,则必须从代码中创建代码,例如:

Button  btn  = new Button (mActivity, null, R.attr.someattribute);

在attrs.xml中,您可以建立参考

在styles.xml中,您定义一个主题

@style/someStyle

例如,styles.xml中的最新定义

2px

fill_parent

@drawable/actionbar_compat_separator

根据我的理解,这有效,并且这是在Android代码中的View上设置样式的方法。 这似乎过于复杂。 按钮的第三个构造函数Argument可以轻松接受样式ID R.style.XXX

谁能解释为什么需要这种额外的复杂性?

感谢您解释它在Android系统资源中的工作方式,它帮助我回答了自己的问题(stackoverflow.com/questions/11023335/)

这与Android中鼓励使用Views的模式有关。这不是您要尝试执行的操作的预期方法。首先,我将解释这种机制的作用,然后为您的应用提出一种建议。

View构造函数的第三个参数采用attr资源,通常在实现View子类时使用,如您所显示的,它允许您指定主题属性以用作对View的默认样式的引用。如果您有一种称为AwesomeButton的特殊按钮,则可以这样实现其构造函数:

public class AwesomeButton extends Button {
public AwesomeButton(Context context) {
this(context, null);
}
public AwesomeButton(Context context, AttributeSet attrs) {
this(context, attrs, R.attr.awesomeButtonStyle);
}
public AwesomeButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr) {
final TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.AwesomeButton, defStyleAttr, 0);
// Read AwesomeButton-specific style attributes from a
a.recycle();
}
// More code
}

当Android的LayoutInflater扩展视图时,它使用带有参数(Context, AttributeSet)的2参数构造函数。 R.attr常量传递给3参数版本,然后在super调用中传递到Button的3参数构造函数。这意味着Button将根据主题中指定的AwesomeButton的默认样式读取其封装的内容的默认样式信息。 Android中的某些视图与其父类的不同之处仅在于它们使用的默认样式。 (Button实际上是其中之一。)

您可以在样式中指定android:layout_width和android:layout_height,但这可能会有问题。 LayoutParams(任何以layout_开头的属性)特定于父视图,而不是出现在其上的视图。这就是为什么您始终将预期的父视图作为第二个参数传递给LayoutInflater#inflate的原因-它告诉充气机哪个类应负责解释LayoutParams。如果跳过此步骤,您通常会发现LayoutParams的行为不符合您的预期,并且经常被完全忽略。按照惯例,即使在某些特殊情况下,LayoutParams也不起作用。

看起来您正在尝试将样式用作模板。是否有理由不为此使用布局资源并在那里指定样式?

final LayoutInflater inflater = LayoutInflater.from(mActivity);
Button btn = (Button) inflater.inflate(R.layout.styled_button, parentView, false);
RES /布局/styled_button.xml:
android:layout_height="wrap_content"
android:background="@drawable/my_button_background"
[...] />

这是一个很好的答案,我的代码现在更简单了。我真的不需要"一路走好"并创建一个新主题。我最终保留了我的android:layout_height =" @ dimen / actionbar_compat_height"。另一个选择可能是为layout-xlarge等创建不同的styled_button.xml。感谢您抽出宝贵的时间。我明白了

哇。我非常喜欢这个答案,所以我赞成这个和另一个来自同一用户的:-)

我想知道它如何按预期工作。公共类Button扩展TextView {public Button(Context context){this(context,null); } public Button(Context context,AttributeSet attrs){this(context,attrs,com.android.internal.R.attr.buttonStyle); }

在具有既有newView又有bindView方法的ListAdapter的上下文中,这如何工作?我可以/应该在bindView中更改视图似乎并不直观。当我单击以更改其状态时如何切换视图对象?

您不应该尝试更改现有视图的样式,尤其是在切换状态的情况下。有关状态切换的信息,请参见CheckBox之类的工作原理,定义可设置和清除的可绘制状态。如果您需要彻底更改列表项的主布局,最好的方法可能是更改项目视图类型,以便您可以适当地创建/添加新布局并让ListView为您跟踪差异。