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 виджеты.

Чтобы добиться того, чего вы хотите, вам необходимо:

  1. Проверьте, используете ли вы API 21 или более API 21 и используйте режим счетчика (и поймите, что имена классов делегатов часов и счетчика включены в API 21, ааа).
  2. Получите доступ ко всем NumberPicker s.
  3. Получить доступ к этим NumberPicker разделители.
  4. Оттенок расклинивающего элемента с новым цветом.

Вот хорошие вещи.

Поскольку фактическая реализация - это страницы длиной, я вместо этого буду размещать ссылки:

  • 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" />
Другие вопросы по тегам