我一直在与平衡臃肿的xml布局和难以掌握的style.xml进行斗争。因此,我开始尝试为每种类型的输入字段创建一个新的小部件。例如,我在应用程序中的任何地方都有一个蓝色按钮,所以我正在制作一个BlueButton,它只是做它的构造函数中我想做的事情:
public class BlueButton extends AppCompatButton {
public BlueButton(Context context) { this(context,null); }
public BlueButton(Context context, AttributeSet attrs) { this(context, attrs, 0); }
public BlueButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setBackgroundResource(R.drawable.bg_button_blue_gradient);
setTextSize(COMPLEX_UNIT_SP,20);
setAllCaps(true);
setGravity(CENTER); setTextColor(ContextCompat.getColor(context,android.R.color.white));
}
}
<app.ui.widget.BlueButton
android:id="@+id/myButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
tools:text="My Happy Blue Button"
/>这似乎太明显了,我肯定我错过了什么。做这件我错过的事情有什么坏处?
发布于 2018-11-06 21:08:05
您发布的BlueButton类可以作为样式资源:
<style name="BlueButton">
<item name="android:background">@drawable/bg_button_blue_gradient</item>
<item name="android:textSize">20sp</item>
<item name="android:textAllCaps">true</item>
<item name="android:gravity">center</item>
<item name="android:textColor">@android:color/white</item>
</style>从您的问题看来,您可能已经知道这一点,但我这样说是为了让我们可以将样式资源与您发布的Java代码进行比较。
在一种情况下,您需要更改所使用的标记:
<app.ui.widget.BlueButton ... />在另一种情况下,添加一个style属性:
<Button style="@style/BlueButton" ... />这些在我看来并没有太大的不同。在Java类上,您可以像使用样式资源一样容易地使用IDE工具,比如“查找用法”。因此,唯一的问题是,您是否认为样式资源比Java类“更难管理”。
就我个人而言,我不认为他们是。
也许您不喜欢有一个包含500个样式定义的大型styles.xml文件。如果是这样的话,那么正确的方法是将styles.xml文件拆分成更小的文件,而不是创建Java类。毕竟,您可以拥有一个只有这一种样式资源的bluebutton.xml文件。
编辑:我把这个放在下面,因为我认为它更重要。可惜我第一次没想出来。
至于缺点,创建像您的BlueButton这样的视图子类将“破坏”在构造函数中设置的属性。假设我想使用BlueButton,但这次我想要黑色文本而不是白色文本。其他的都是“蓝色按钮”,但我写不出来:
<app.ui.widget.BlueButton
android:textColor="@android:color/black"
... />在这种情况下,我的按钮仍然会有白色文本!这是因为super构造函数解析了这些属性,但是BlueButton构造函数会覆盖这些属性。另一方面,如果我用了一种风格:
<Button
android:textColor="@android:color/black"
style="@style/BlueButton"
... />我的按钮现在会有黑色的文本。
我反对创建View子类而不是使用样式的另一个论点是,View子类无法在应用程序的生存期内强制执行实例与给定的样式匹配。没有什么能阻止我将一个BlueButton添加到我的布局中,但是稍后会调用button.setBackgroundResource(R.drawable.foo)。
使用样式可以更明确地表明这只是按钮的初始状态。然后,我就不会想通过做一些像if (button instanceof BlueButton)这样的操作来检查我的按钮是否有蓝色的背景,这甚至不能保证工作(如上面所述)。
tl;dr:生成视图子类并不可怕,但我认为它比使用样式属性稍微差一些。
https://stackoverflow.com/questions/53179421
复制相似问题