Изменение цвета текста TimePicker

Я пытался изменить цвет текста моих часов. Но я не могу найти, где находится родительский стиль. Я пробовал оба

<style name="MyTimePicker" parent="@android:style/Widget.Holo.TimePicker">
    <item name="android:textColor">@color/text</item>
</style>

и

<style name="MyTimePicker" parent="@android:style/Widget.TimePicker">
    <item name="android:textColor">@color/text</item>
</style>

мой minSdkVersion - это 15. Мой targetSdkVersion - это 20. Я восстановил и очистил свой проект.
Я думаю, что я прошел через каждый подобный вопрос на SO, и ни один из них не предоставил мне решение. Единственный ответ, который может работать, - это использование какой-то библиотеки, но я не большой поклонник этого решение. Является ли путь к родителю чем-то отличным от того, что я использую, потому что я уверен, что должен каким-то образом получить к нему доступ?

редактировать
Вот как применяется тема;

<TimePicker
    style="@style/MyTimePicker"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/timePicker"
    android:layout_below="@+id/textView"
    android:layout_centerHorizontal="true" />

на заметке это ошибка, которую я получаю (забыл разместить ее раньше):

ошибка:Ошибка при получении родителем для элемента: ресурс не найден, что соответствует данное имя '@андроид:стиль/виджет.Голографический.Элемента управления datepicker'.

Изменить 2 Несколько вопросов, которые я просмотрел, чтобы попытаться решить эту проблему:

  1. как я могу переопределить TimePicker для изменения цвета текста - я думаю, что этот вопрос так близко к ответу, но я не совсем уверен, что мне нужно делать? Нужно ли импортировать стиль Android TimePicker в мой проект?
  2. https://stackoverflow.com/questions/24973586/set-textcolor-for-timepicker-in-customized-app-theme

5 ответов


Я объединил ответ Пола Берка и Симона для успешного редактирования цвета текста TimePicker.

вот как это совершается:

TimePicker time_picker; //Instantiated in onCreate()
Resources system;

private void set_timepicker_text_colour(){
    system = Resources.getSystem();
    int hour_numberpicker_id = system.getIdentifier("hour", "id", "android");
    int minute_numberpicker_id = system.getIdentifier("minute", "id", "android");
    int ampm_numberpicker_id = system.getIdentifier("amPm", "id", "android");

    NumberPicker hour_numberpicker = (NumberPicker) time_picker.findViewById(hour_numberpicker_id);
    NumberPicker minute_numberpicker = (NumberPicker) time_picker.findViewById(minute_numberpicker_id);
    NumberPicker ampm_numberpicker = (NumberPicker) time_picker.findViewById(ampm_numberpicker_id);

    set_numberpicker_text_colour(hour_numberpicker);
    set_numberpicker_text_colour(minute_numberpicker);
    set_numberpicker_text_colour(ampm_numberpicker);
}

private void set_numberpicker_text_colour(NumberPicker number_picker){
    final int count = number_picker.getChildCount();
    final int color = getResources().getColor(R.color.text);

    for(int i = 0; i < count; i++){
        View child = number_picker.getChildAt(i);

        try{
            Field wheelpaint_field = number_picker.getClass().getDeclaredField("mSelectorWheelPaint");
            wheelpaint_field.setAccessible(true);

            ((Paint)wheelpaint_field.get(number_picker)).setColor(color);
            ((EditText)child).setTextColor(color);
            number_picker.invalidate();
        }
        catch(NoSuchFieldException e){
            Log.w("setNumberPickerTextColor", e);
        }
        catch(IllegalAccessException e){
            Log.w("setNumberPickerTextColor", e);
        }
        catch(IllegalArgumentException e){
            Log.w("setNumberPickerTextColor", e);
        }
    }
}

обратите внимание, что этот ответ может быть устаревшим сейчас. Я столкнулся с этим некоторое время назад с чем-то, что может быть багги (см. мой вопрос для более подробной информации). В противном случае вы, вероятно, должны следовать ответу Викрама.


не уверен, почему вам нужно будет погрузиться в API отражения Java для этого. Его простой стиль дело. Атрибут, который необходимо переопределить:textColorPrimary.

<style name="AppTheme" parent="@android:style/Theme.Holo.Light">
    ....
    <item name="android:textColorPrimary">#ff0000</item>
</style>

если вы используете TimePicker внутри Dialog, переопределить android:textColorPrimary в теме диалога.

вот и все.


A TimePicker на самом деле просто два NumberPickers. Глядя в Widget.NumberPicker стиль и макет, вы найдете, что он использует

@style/TextAppearance.Large.Inverse.NumberPickerInputText

к сожалению, TextAppearance.Large.Inverse.NumberPickerInputText не использует один из атрибутов, которые можно задать в теме. Таким образом, у вас есть два варианта:

  1. скопируйте необходимые классы, чтобы сделать свою собственную версию NumberPicker и TimePicker. (Возможно, вы сможете извлечь что-то из библиотек, таких как HoloEverywhere)

  2. использовать хаки.

если вы хотите пройти второй маршрут, вы можете сделать это:

private int mNumberPickerInputId = 0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Resources system = Resources.getSystem();

    // This is the internal id of the EditText used in NumberPicker (hack)
    mNumberPickerInputId = 
        system.getIdentifier("numberpicker_input", "id", "android");

    // just used for full example, use your TimePicker
    TimePicker timePicker = new TimePicker(this);
    setContentView(timePicker);

    final int hourSpinnerId = 
        system.getIdentifier("hour", "id", "android");
    View hourSpinner = timePicker.findViewById(hourSpinnerId);
    if (hourSpinner != null) {
        setNumberPickerTextColor(hourSpinner, Color.BLUE);
    }

    final int minSpinnerId = 
        system.getIdentifier("minute", "id", "android");
    View minSpinner = timePicker.findViewById(minSpinnerId);
    if (minSpinner != null) {
        setNumberPickerTextColor(minSpinner, Color.BLUE);
    }

    final int amPmSpinnerId = 
        system.getIdentifier("amPm", "id", "android");
    View amPmSpinner = timePicker.findViewById(amPmSpinnerId);
    if (amPmSpinner != null) {
        setNumberPickerTextColor(amPmSpinner, Color.BLUE);
    }
}

private void setNumberPickerTextColor(View spinner, int color) {
    TextView input = (TextView) spinner.findViewById(mNumberPickerInputId);
    input.setTextColor(color);
}

редактировать

после дальнейшего расследования, этот хак на самом деле не работает хорошо. Это не позволит вам изменить цвет NumberPicker выше/ниже значения. Цвет также сбрасывается после взаимодействия с ним. Кажется, что ваш единственный вариант-создать свои собственные копии нужных классов (Вариант № 1 выше).


@Vikram прав Это так просто.Вы можете попробовать этот путь

<style name="abirStyle" parent="@android:style/Theme.Holo.Light.Dialog.NoActionBar">
    <item name="android:textColor">@color/colorPrimary</item>
    <item name="android:background">@null</item>
    <item name="android:textColorPrimary">@color/colorPrimary</item>
</style>

вы можете попробовать указать android: textColorPrimaryInverse и android: textColorSecondaryInverse. Это должно сделать работу без использования отражения.

<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <item name="android:textColorPrimaryInverse">@android:color/black</item>
    <item name="android:textColorSecondaryInverse">@color/colorLightGrey</item>
</style>