我的 Android 应用程序中有一个日期选择器,但现在我想将蓝色分隔线的颜色更改为绿色(请参阅本文下方的图片)。在 Stackoverflow 上还有一些 其他 讨论也讨论了同样的问题,但没有一个给出导致解决方案的答案。
所以我自己去找,发现实际上有一个 android:datePickerStyle,还有一个 android:divider。但是,我不知道分隔符是否实际上是指日期选择器中的分隔符。我尝试了两者的多种组合,但我似乎没有让它起作用。所以我的第一个问题:android:divider 是否指的是日期选择器中的分隔符,我如何使用它来改变颜色?
所以另一个选项应该是创建一个全新的自定义日期选择器。如果这让我能够改变分隔线的颜色,我会为之倾倒。因此,我不得不看看一些 的 的 教程创建自定义日期选择器,但他们都不来定义分隔的颜色。分隔符根本没有在 xml 文件或 java 文件中列出。
如果有某种样板代码来重新创建当前显示的日期选择器,包括设置分隔线颜色的代码,那就太好了。希望这能让我复制它并简单地在某处更改分隔线的颜色设置。所以我的第二个问题:有人知道任何简单地实现日期选择器的样板代码吗(包括分隔符的定义)?
不幸的是,这不是一项微不足道的任务。
DatePickers
使用小部件NumberPicker
和CalendarView
内部。例如,您发布的图片使用的是 3NumberPickers
。你所说的分隔符来自 NumberPicker 的属性:selectionDivider
。问题是这个属性不是公开的,也不是numberPickerStyle
,通过它来设置这个属性。我最近将 CalendarView 和 NumberPicker 向后移植到 API 8,主要是为了好玩。由于代码随时可用(
android.widget.NumberPicker
在 android 的源代码中查找和其他代码),所有这些任务都需要时间,以及一些挖掘 android 源代码的工作。例子:简单 ==> 您必须将私有变量从 View 类更改为它们的访问器方法
mLeft(View 类中的受保护变量)==> getLeft()(公共访问器方法)
最耗时的任务是恢复辅助功能方法。
在任何情况下,如果您决定编写 DatePicker 的自定义实现,则还必须为 NumberPicker 和 CalendarView(可选)编写它们。
更简单的方法:
向后移植的 DatePicker 可在此处用作库:Android-DatePicker。如上所述,您将与此 DatePicker 结合使用反向移植的CalendarView和NumberPicker。
你需要改变的:
使用
{library-numberpicker} / res / drawable-xxxx / np_numberpicker_selection_divider.9.png
作为模板,并改变“蓝色”的颜色为绿色(我用的Pixlr)。如果您想完全使用蓝色分隔线,您可以使用相同的名称保存它,或者使用不同的名称并在{library-numberpicker} / res / values / themes.xml
.themes.xml
如果您选择不同的名称,则所需的更改:<style name="NPWidget.Holo.NumberPicker" parent="NPWidget.NumberPicker"> .... <item name="selectionDivider">@drawable/new_nine_path_drawable_name</item> .... </style>
就是这样。
使用库输出:
编辑:
该属性
divider
实际上来自LinearLayout
.NumberPicker
将此属性继承为NumberPicker extends LinearLayout
. 但这divider
有不同的目的。传递给此属性的可绘制对象放置在 的子视图之间LinearLayout
。该属性
android:showDividers
用于更改此分隔符的位置,可能的值为:该属性
android:dividerPadding
是不言自明的。即使 NumberPicker 继承了这个属性,它也不使用它。这从您自己的研究和试验中可以明显看出:
I tried a multitude of combinations of the two, but I don't seem to get it to work.
要查看操作中的分隔线属性:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:divider="@android:drawable/ic_media_play" android:showDividers="middle" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="World," /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Again" /> </LinearLayout>
使用 Java 反射的 Hack-ish 解决方法:
这个答案在这里给了我这个想法。我一般讨厌使用反射,主要是出于此答案中列出的原因:链接。虽然我在这里列出它是为了完整起见,但我建议您不要使用它。
public class CDP extends android.widget.DatePicker { public CDP(Context context, AttributeSet attrs) { super(context, attrs); Class<?> internalRID = null; try { internalRID = Class.forName("com.android.internal.R$id"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Field month = null; try { month = internalRID.getField("month"); } catch (NoSuchFieldException e) { e.printStackTrace(); } NumberPicker npMonth = null; try { npMonth = (NumberPicker) findViewById(month.getInt(null)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } Field day = null; try { day = internalRID.getField("day"); } catch (NoSuchFieldException e) { e.printStackTrace(); } NumberPicker npDay = null; try { npDay = (NumberPicker) findViewById(day.getInt(null)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } Field year = null; try { year = internalRID.getField("year"); } catch (NoSuchFieldException e) { e.printStackTrace(); } NumberPicker npYear = null; try { npYear = (NumberPicker) findViewById(year.getInt(null)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } Class<?> numberPickerClass = null; try { numberPickerClass = Class.forName("android.widget.NumberPicker"); } catch (ClassNotFoundException e) { e.printStackTrace(); } Field selectionDivider = null; try { selectionDivider = numberPickerClass.getDeclaredField("mSelectionDivider"); } catch (NoSuchFieldException e) { e.printStackTrace(); } try { selectionDivider.setAccessible(true); selectionDivider.set(npMonth, getResources().getDrawable( R.drawable.np_numberpicker_selection_divider_green)); selectionDivider.set(npDay, getResources().getDrawable( R.drawable.np_numberpicker_selection_divider_green)); selectionDivider.set(npYear, getResources().getDrawable( R.drawable.np_numberpicker_selection_divider_green)); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NotFoundException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } }
我们在这里做什么:
date_picker.xml
的sdk/platforms/android-xx/res/layout
,你会看到这三个NumberPickers有IDmonth
,day
,year
。我们可以android.internal.R.id
获取这些 NumberPicker 的资源 ID。findViewById(int)
方法创建了三个 NumberPicker 对象。mSelectionDivider
。Field#set(Object, Object)
方法设置其值。第一个参数是我们执行此操作的对象。第二个参数是我们要设置的对象。我用过的 drawable 可以从这里下载。