Изменение цвета текста 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 Несколько вопросов, которые я просмотрел, чтобы попытаться решить эту проблему:
- как я могу переопределить TimePicker для изменения цвета текста - я думаю, что этот вопрос так близко к ответу, но я не совсем уверен, что мне нужно делать? Нужно ли импортировать стиль Android TimePicker в мой проект?
- 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
на самом деле просто два NumberPicker
s. Глядя в Widget.NumberPicker
стиль и макет, вы найдете, что он использует
@style/TextAppearance.Large.Inverse.NumberPickerInputText
к сожалению, TextAppearance.Large.Inverse.NumberPickerInputText
не использует один из атрибутов, которые можно задать в теме. Таким образом, у вас есть два варианта:
скопируйте необходимые классы, чтобы сделать свою собственную версию
NumberPicker
иTimePicker
. (Возможно, вы сможете извлечь что-то из библиотек, таких как HoloEverywhere)использовать хаки.
если вы хотите пройти второй маршрут, вы можете сделать это:
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>