android:使用动态值自定义按钮

时间:2012-01-06 11:08:17

标签: android dynamic user-interface colors

我想为我的应用程序自定义按钮。该应用程序有一个颜色选择器,用户将选择颜色,我必须将该特定的开始/结束颜色设置为按钮。这些colro值将存储在对象“Utility”中。

基本上从一开始,我想使用“Utility”对象来设置背景,文本颜色,字体等颜色。再次当用户更改颜色时,我需要将其更改为按钮并刷新它们。并且还要保存文件中的颜色,因此下次用户启动应用程序时,它会选择最后一种颜色。

我找不到<selector>是最好的选择,因为我无法更改xml中的颜色。什么是这种要求的最佳选择?

更新: @jitendra,从你的回答我得到了一些帮助。我使用GradientDrawable来设置按钮的颜色。在Activity的onCreate()中,我调用了一个方法RefreshComponents(),它设置了root的背景,按钮的文本颜色/大小和按钮的渐变颜色。它工作正常,但我看到的唯一问题是将GradientDrawable应用于按钮时,2个按钮之间的间隙丢失。

这是没有应用GradientDrawable的图像: enter image description here

在应用GradientDrawable时,输出为: enter image description here

您会看到按钮的大小从所有侧面略微增加。如果我也申请下一个按钮,他们都会互相触碰。我上面的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?

任何帮助都是为了帮助我实现目标。

由于

4 个答案:

答案 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?

如果有人对此有回答,请告诉我。

由于