android:使用动态值自定义按钮
我想为我的应用程序自定义按钮。该应用程序有一个颜色选择器,用户将在其中选择颜色,我必须为按钮设置特定的开始/结束颜色。这些colro值将存储在对象“实用程序”中 基本上从一开始,我想使用“实用工具”对象来设置背景、文本颜色、字体等的颜色。当用户更改颜色时,我需要将其更改为按钮并刷新它们。还可以将颜色保存到文件中,以便下次用户启动应用程序时,它会显示最后选择的颜色 我找不到android:使用动态值自定义按钮,android,dynamic,user-interface,colors,Android,Dynamic,User Interface,Colors,我想为我的应用程序自定义按钮。该应用程序有一个颜色选择器,用户将在其中选择颜色,我必须为按钮设置特定的开始/结束颜色。这些colro值将存储在对象“实用程序”中 基本上从一开始,我想使用“实用工具”对象来设置背景、文本颜色、字体等的颜色。当用户更改颜色时,我需要将其更改为按钮并刷新它们。还可以将颜色保存到文件中,以便下次用户启动应用程序时,它会显示最后选择的颜色 我找不到是最好的选择,因为我无法更改xml中的颜色。对于这种要求,什么是最好的选择 更新: @吉坦德拉,从你的回答中我得到了一些有用的
是最好的选择,因为我无法更改xml中的颜色。对于这种要求,什么是最好的选择
更新:
@吉坦德拉,从你的回答中我得到了一些有用的东西。我使用GradientDrawable设置按钮的颜色。在活动的onCreate()中,我调用了RefreshComponents()方法,该方法设置根的背景、按钮的文本颜色/大小以及按钮的渐变色。它工作正常,但我看到的唯一问题是将GradientDrawable应用于按钮时,两个按钮之间的间隙丢失
这是未应用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
最后,在onCreate()中,我添加了:
这里出了什么问题?按钮周围的边距是否变为0?我必须为渐变设置边界,还是再次为按钮设置LayoutParams
任何帮助都是对帮助我实现目标的感激
感谢Android,但它们是开发时的功能,不能在运行时操作。但是,可以在运行时应用不同的预定义主题
因此,您可以拥有一组预定义的主题,具有固定的视图属性(颜色、字体等),并为用户提供在运行时选择主题的选项
但是,如果您需要更改每个特定的视图属性,那么您将需要滚动您自己的“主题”系统。这意味着您需要将属性存储在某个位置,并在每次构建视图时应用这些属性。您可以在java文件中动态创建StateListDrawable对象,并将其设置为应用程序组件的背景和源。
setOnClickListener
,并使用分配给每个按钮的setOnClickListener
方法中的代码执行颜色更改操作。除此之外,还必须配置color.xml文件和自定义主题。有很多工作要做。但我不确定哪种方法最好。我强烈建议你阅读我在我的博客中提供给你的android学习资料。只有他们能给你一个详细的洞察力和一个坚实的想法去进行。祝你一切顺利 哦,我找到了解决办法:
我为按钮添加了layout_marginRight属性,这就完成了工作
尽管我仍然担心,如果没有GradientDrawable,按钮之间有边距,那么在应用GradientDrawable之后,为什么默认边距会丢失?为什么需要添加额外的布局_marginRight
如果还有人对此有答案,请告诉我
谢谢那么,我可以在运行时编辑“colors.xml”吗?若什么都不起作用,那个么当然我必须在每个活动的onCreate方法(我猜)中编写代码,在这里我根据保存在Utility对象中的方法设置所有属性。类似于btn1.setTextColor(Utility.getTextColor())。您在前面的回答中提供的学习资料,都包含购买书籍的链接&我买不起。@Tvd:不,您不能在运行时编辑资源文件(colors.xml等)。@Tvd:只需谷歌搜索这些书籍。它们都可以免费下载。我就是这样下载的。如果你在任何地方都找不到,如果你觉得安全的话,给我你的邮件id。我会寄给你的。就更改资源而言,您不能在运行时进行更改。如果你这样做,那是没有用的。@Ghost,谢谢你提供的书籍信息。虽然它在这个问题上对我没有帮助,但在其他问题上肯定是好的。预定义的主题也是不允许的。每件事都是纯动态的-无论用户选择什么-背景、2种渐变色、文本颜色等。你能更关注你的point reg“滚动你自己的主题系统”。@Tvd:你的意思是在你的应用程序或android中“不允许预定义主题”吗?在我的应用程序中。正如前面所说的,一切都是基于用户选择的动态的,所以预定义可以没有空间。我不需要为不同的状态使用不同的样式,所以我没有使用StateListDrawable,而是尝试使用GradientDrawable。但是按钮的大小改变了。看一下我更新的问题。除非在更改背景时在代码中设置了布局参数,否则不需要更新布局参数,但似乎在更改背景时添加了一些布局参数。@jitendrasharma,我的下一个目标是动态调整布局大小,这样可以自动调整按钮的大小。请看一看并尝试帮助-@jitendrasharma,我不打算更改每个按钮的布局参数。以上只是一点。但实际上,给按钮添加marginRight只起到了作用。想知道他们的问题应该是其他的,或者我可能在某个地方出错了,但找不到。我没有看到你更新的问题,但现在我看到了。你为什么不减少你的填充物?这可能会有帮助。@Ghost,是的,这就是我所做的,在根布局中添加更多的填充,在按钮上添加右边的边框。但奇怪的是,为什么在实现GradientDrawable后尺寸会增加。并且没有在任何按钮或内部布局中使用任何paddign,那么我在哪里减少它???对不起!我没注意到那一点
public static GradientDrawable getButtonDrawable(Button btn) {
int colors[] = {getStartColor(), getEndColor()};
GradientDrawable grad = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, colors);
grad.setCornerRadius(5f);
return grad;
}
GradientDrawable btnGradient = Utility.getButtonDrawable(btn1);
btn1.setBackgroundDrawable(btnGradient);