Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android:使用动态值自定义按钮_Android_Dynamic_User Interface_Colors - Fatal编程技术网

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

android:使用动态值自定义按钮,android,dynamic,user-interface,colors,Android,Dynamic,User Interface,Colors,我想为我的应用程序自定义按钮。该应用程序有一个颜色选择器,用户将在其中选择颜色,我必须为按钮设置特定的开始/结束颜色。这些colro值将存储在对象“实用程序”中 基本上从一开始,我想使用“实用工具”对象来设置背景、文本颜色、字体等的颜色。当用户更改颜色时,我需要将其更改为按钮并刷新它们。还可以将颜色保存到文件中,以便下次用户启动应用程序时,它会显示最后选择的颜色 我找不到是最好的选择,因为我无法更改xml中的颜色。对于这种要求,什么是最好的选择 更新: @吉坦德拉,从你的回答中我得到了一些有用的

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

基本上从一开始,我想使用“实用工具”对象来设置背景、文本颜色、字体等的颜色。当用户更改颜色时,我需要将其更改为按钮并刷新它们。还可以将颜色保存到文件中,以便下次用户启动应用程序时,它会显示最后选择的颜色

我找不到
是最好的选择,因为我无法更改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);