Ответ 1
К сожалению, это не тривиальная задача.
DatePickers
использовать виджеты NumberPicker
и CalendarView
внутренне. Например, изображение, которое вы опубликовали, использует 3 NumberPickers
. И разделители, о которых вы говорите, исходят из атрибута NumberPicker: selectionDivider
. Проблема в том, что этот атрибут не является общедоступным, и ни один numberPickerStyle
, через который этот атрибут не установлен.
Недавно я обновил CalendarView и NumberPicker до API 8, в основном для развлечения. Так как код легко доступен (посмотрите android.widget.NumberPicker
и другие в источнике android), все это задача занимает время, а некоторые копаются через исходный код Android. Примеры:
-
Easy == > Вам придется изменить приватную переменную из класса View в их методы доступа
mLeft (защищенная переменная в классе View) == > getLeft() (общедоступный метод доступа)
-
Самая трудоемкая задача - восстановить методы доступности.
В любом случае, если вы решите написать пользовательскую реализацию DatePicker, вам придется писать их для NumberPicker и CalendarView (необязательно).
Простой способ:
Backported DatePicker доступен в виде библиотеки здесь: Android-DatePicker. Как упоминалось выше, вы будете использовать backported CalendarView и NumberPicker в сочетании с этим DatePicker.
Что вам нужно изменить:
Используйте {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>
И что это.
Вывод с использованием библиотек:
Edit:
Относится ли
android:divider
к делителю в datepicker и как я могу использовать его для изменения цвета?
Атрибут divider
на самом деле происходит от LinearLayout
. NumberPicker
наследует этот атрибут как NumberPicker extends LinearLayout
. Но это divider
служит другой цели. Выделение, переданное этому атрибуту, помещается между дочерними представлениями LinearLayout
.
Атрибут android:showDividers
используется для изменения размещения этого разделителя, возможны следующие значения:
- нет: нет показанных разделителей
- начало: разделитель отображается перед представлением первого ребенка
- middle: Divider отображается после каждого дочернего представления, а не после последнего детского представления
- end: Divider отображается после последнего детского представления
Атрибут android:dividerPadding
не требует пояснений.
Несмотря на то, что NumberPicker наследует этот атрибут, он не использует его. Это видно из ваших собственных исследований и испытаний: I tried a multitude of combinations of the two, but I don't seem to get it to work.
Чтобы увидеть атрибут divider в действии:
<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>
Обходное решение Hack-ish с использованием java-отражения:
Этот ответ здесь дал мне эту идею. Я ненавижу использование рефлексов вообще, в основном по причинам, перечисленным в этом ответе: Ссылка. Хотя я перечисляю его здесь для полноты, я предлагаю вам не использовать его.
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();
}
}
}
Что мы здесь делаем:
- Расширить DatePicker
- Если вы откроете
date_picker.xml
вsdk/platforms/android-xx/res/layout
, вы увидите, что у трех NumberPickers есть идентификаторыmonth
,day
,year
. Мы получаем доступ кandroid.internal.R.id
, чтобы получить идентификаторы ресурсов для этих NumberPickers. - Мы создаем три объекта NumberPicker, используя эти идентификаторы с помощью метода
findViewById(int)
. - Затем выберите и извлеките поле
mSelectionDivider
, используя выбор. - Установите доступное поле (как его объявленное окончание), установите его значение с помощью метода
Field#set(Object, Object)
. Первый аргумент - это объект, над которым мы выполняем эту операцию. Второй аргумент - это Object, который мы хотим установить.
Загружаемый множитель можно скачать с помощью здесь.