TimePickerDialog со старым стилем и другим цветом
Я создал TimePickerDialog и изменил цвет по умолчанию. Кроме того, я хотел бы изменить стиль на другой стиль.
Я не мог найти способ изменить цвет и стиль одновременно.
Вот как я создал свой TimePickerDialog:
TimePickerDialog Code:
public void showHourPicker() {
final Calendar myCalender = Calendar.getInstance();
int hour = myCalender.get(Calendar.HOUR_OF_DAY);
int minute = myCalender.get(Calendar.MINUTE);
TimePickerDialog.OnTimeSetListener myTimeListener = new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
if (view.isShown()) {
myCalender.set(Calendar.HOUR_OF_DAY, hourOfDay);
myCalender.set(Calendar.MINUTE, minute);
updateHourEditText(myCalender);
}
}
};
TimePickerDialog timePickerDialog = new TimePickerDialog(getContext(),R.style.TimePickerDialogStyle , myTimeListener, hour, minute, true);
timePickerDialog.setTitle("Choose hour:");
timePickerDialog.show();
}
И это стиль
<style name="TimePickerDialogStyle" parent="Theme.AppCompat.Light.Dialog.Alert">
<item name="colorControlActivated">@color/mcgpalette_300</item>
<item name="colorAccent">@color/mcgpalette_300</item>
</style>
И TimePickerDialog, который я получаю, выглядит так:
Если я попытаюсь изменить стиль, как вы можете видеть на рисунке ниже, я получу стиль, который мне нужен, но не в цвете, как в примере выше. Код для хорошего стиля, но без моего цвета:
TimePickerDialog timePickerDialog = new TimePickerDialog(getContext(), 2 , myTimeListener, hour, minute, true);
Мой вопрос: как я могу установить стиль, как на втором изображении, а цвет как на первом?
2 ответа
Как я могу установить стиль таким же, как на втором изображении, а цвет - на первом?
Вам понадобится некоторое размышление, поскольку для этого нет общедоступного API.
Скучные вещи, вы можете пропустить это.
Некоторые внутренности:
Ниже API 21 второй стиль, известный как "режим вращения", является единственным доступным стилем. С API 21 доступен еще один "режим часов" и
TimePicker
делегаты виджета работают с внутренними классами в зависимости от выбранного стиля.Режим счетчика состоит из нескольких
NumberPicker
виджеты.
Чтобы добиться того, чего вы хотите, вам необходимо:
- Проверьте, используете ли вы API 21 или более API 21 и используйте режим счетчика (и поймите, что имена классов делегатов часов и счетчика включены в API 21, ааа).
- Получите доступ ко всем
NumberPicker
s. - Получить доступ к этим
NumberPicker
разделители. - Оттенок расклинивающего элемента с новым цветом.
Вот хорошие вещи.
Поскольку фактическая реализация - это страницы длиной, я вместо этого буду размещать ссылки:
XpNumberPicker
позволяет изменить разделитель (или просто цвет разделителя) любогоNumberPicker
,XpDatePicker
позволяет изменить цвет делителя любого стиля блесныDatePicker
,XpTimePicker
позволяет изменить цвет делителя любого стиля блесныTimePicker
,
Скопируйте все эти классы в свой проект.
Вам понадобится ColorStateList
вашего нового цвета делителя. Я оставлю получение этого до вас.
Пример:
final int color = ContextCompat.getColor(timePicker.getContext(), R.color.accent);
final ColorStateList csl = ColorStateList.valueOf(color);
XpTimePicker.setSelectionDividerTint(timePicker, csl);
Подвох.
У вас нет доступа к TimePicker
из TimePickerDialog
,
final int timePickerId = context.getResources().getIdentifier("android:id/timePicker", null, null);
final TimePicker timePicker = (TimePicker) timePickerDialog.findViewById(timePickerId);
Я не проверял этот последний бит.
Название
TimePickerDialog
продолжается Dialog
которая использует тему Holo ниже API 21. Это означает, что у вас всегда есть синий заголовок с синим подчеркиванием. Как обойти это?
- Скрыть заголовок полностью, позвонив
timePickerDialog.setTitle(null)
, - Ручной подход.
- Найти заголовок вида (
android:id/title
) и измените его цвет текста. - Найти вид делителя (
android:id/titleDivider
) и измените его цвет фона. Этот идентификатор не является частью общедоступного API. - Если макет заголовка диалога не является Holo по умолчанию, он может не иметь этих представлений!
- Найти заголовок вида (
- Использовать
android.support.v7.app.AlertDialog
сTimePicker
для темы Материал на всех платформах, предоставляемых библиотекой AppCOmpat.
В конце дня, TimePickerDialog
это просто диалоговое окно с предупреждением TimePicker
, Вы можете взять его код и создать свой собственный AlertDialog
с TimePicker. Это означает, что вы можете настроить любые атрибуты выбора времени. Я предлагаю вам создать новый диалог xml и надуть его в своем пользовательском AlertDialog. Обязательно позвони setView(View view)
с вашим макетом, как в TimePickerDialog.
В этом примере я установил цвет текста AM/PM на оранжевый.
<TimePicker xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/timePicker"
android:layout_gravity="center_horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:amPmTextColor="@android:color/holo_orange_light"
android:timePickerMode="@integer/time_picker_mode" />