我想为我的应用程序自定义按钮。该应用程序有一个颜色选择器,用户将选择颜色,我必须将该特定的开始/结束颜色设置为按钮。这些colro值将存储在对象“Utility”中。
基本上从一开始,我想使用“Utility”对象来设置背景,文本颜色,字体等颜色。再次当用户更改颜色时,我需要将其更改为按钮并刷新它们。并且还要保存文件中的颜色,因此下次用户启动应用程序时,它会选择最后一种颜色。
我找不到<selector>
是最好的选择,因为我无法更改xml中的颜色。什么是这种要求的最佳选择?
更新: @jitendra,从你的回答我得到了一些帮助。我使用GradientDrawable来设置按钮的颜色。在Activity的onCreate()中,我调用了一个方法RefreshComponents(),它设置了root的背景,按钮的文本颜色/大小和按钮的渐变颜色。它工作正常,但我看到的唯一问题是将GradientDrawable应用于按钮时,2个按钮之间的间隙丢失。
这是没有应用GradientDrawable的图像:
在应用GradientDrawable时,输出为:
您会看到按钮的大小从所有侧面略微增加。如果我也申请下一个按钮,他们都会互相触碰。我上面的xml是:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainroot" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:orientation="vertical"
android:paddingTop="35dip" android:paddingBottom="35dip"
android:paddingLeft="35dip" android:paddingRight="35dip"android:gravity="center" >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mainrow1" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:orientation="horizontal"
android:layout_marginBottom="15dip" android:gravity="center_horizontal" >
<Button android:text="Accounting" android:id="@+id/accBtn" android:layout_width="80dip" style="@style/TileButtonStyle" />
<Button android:text="Data" android:id="@+id/dataBtn" android:layout_width="80dip" android:layout_height="fill_parent"></Button>
<Button android:text="Information" android:id="@+id/infoBtn" android:layout_width="80dip" android:layout_height="fill_parent" android:ellipsize="end"></Button>
</LinearLayout>
..... Other lineasr layout with same parameters as above child
我创建的GradientDrawable是:
public static GradientDrawable getButtonDrawable(Button btn) {
int colors[] = {getStartColor(), getEndColor()};
GradientDrawable grad = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, colors);
grad.setCornerRadius(5f);
return grad;
}
最后在我的onCreate()中,我添加:
GradientDrawable btnGradient = Utility.getButtonDrawable(btn1);
btn1.setBackgroundDrawable(btnGradient);
这里出了什么问题?按钮周围的边距是0吗?我是否必须为渐变设置边界,或者再次为按钮设置LayoutParams?
任何帮助都是为了帮助我实现目标。
由于
答案 0 :(得分:1)
您可以在java文件中动态创建StateListDrawable对象,并将其设置为applcation组件的背景和来源。
答案 1 :(得分:0)
Android有Themes and Styles,但它们是开发时功能,无法在运行时进行操作。但是,可以在运行时应用不同的预定义主题。
因此,您可以拥有一组预定义的主题,具有固定的视图属性(颜色,字体等等),并为用户提供在运行时选择主题的选项。
但是,如果您需要更改每个特定的视图属性,那么您将需要滚动自己的“主题”系统。这意味着您需要将属性存储在某处并在每次构建视图时应用。
答案 2 :(得分:0)
TVD!我倾向于同意Peter Knego和Jitender Sharma。此外,我认为/相信你可以在你的那些按钮上setOnClickListener
并使用分配给每个按钮的setOnClickListener
方法内的代码执行变色。除此之外,您还必须配置color.xml文件和自定义主题。还有很多工作要做。我不确定哪种方式最好。我强烈建议你通过我previous answer中提供给你的android学习内容。只有他们才能为您提供详细的见解和坚实的想法。一切顺利!
答案 3 :(得分:0)
哦,我得到了解决方案:
我将layout_marginRight属性添加到按钮,并完成了工作。
虽然我仍然担心,如果没有GradientDrawable,按钮会有余量,然后应用GradientDrawable后,为什么默认保证金会丢失?为什么需要添加额外的layout_marginRight?
如果有人对此有回答,请告诉我。
由于