我一直在尝试更改时间戳的文字颜色。但我无法找到父母风格所在的位置。我试过了两次
<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" />
注意这是我收到的错误(忘了放在它之前):
错误:检索项目的父项时出错:找不到与给定名称匹配的资源&#39; @android:style / Widget.Holo.TimePicker&#39;。
编辑2 我试图解决这个问题的几个问题:
这些可能是我的问题的最佳问题/答案,但它们都没有帮助我。能够得到明确的答案真是太好了。
答案 0 :(得分:21)
我已合并Paul Burke's Answer和Simon's Answer,以便成功编辑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);
}
}
}
请注意,这个答案现在可能已经过时了。我不久前遇到了一些可能有问题的东西(详情请参阅我的问题)。否则你应该听从维克拉姆的回答。
答案 1 :(得分:4)
不确定为什么需要深入研究Java Reflection API。它是一个简单的造型问题。您需要覆盖的属性是:textColorPrimary
。
<style name="AppTheme" parent="@android:style/Theme.Holo.Light">
....
<item name="android:textColorPrimary">#ff0000</item>
</style>
如果您使用TimePicker
内的Dialog
,请在对话框的主题中覆盖android:textColorPrimary
。
关于它。
答案 2 :(得分:3)
TimePicker
实际上只有两个NumberPicker
。查看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)。
答案 3 :(得分:2)
添加到Vikram答案中,将主题设置为timePicker而不将其设置为样式
在styles.xml
<style name="timePickerOrange">
<item name="android:textColorPrimary">@color/orange</item>
<item name="android:textColor">@color/orange</item>
</style>
和timePicker
<TimePicker
android:theme="@style/timePickerOrange"
android:id="@+id/timePicker_defaultTime"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="@font/hero_regular"
android:timePickerMode="spinner"
app:fontFamily="@font/hero_regular" />
答案 4 :(得分: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>
答案 5 :(得分:0)
您可以尝试设置 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>