更改TimePicker文本颜色

时间:2014-09-24 11:30:38

标签: android xml

我一直在尝试更改时间戳的文字颜色。但我无法找到父母风格所在的位置。我试过了两次

<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 我试图解决这个问题的几个问题:

  1. How can I override TimePicker to change text color - 我认为这个问题接近答案,但我不完全确定我需要做什么?我是否需要将android TimePicker样式导入到我的项目中?
  2. https://stackoverflow.com/questions/24973586/set-textcolor-for-timepicker-in-customized-app-theme - 没有给出答案。
  3. How can i change the textcolor of my timepicker and datepicker? - 尝试了0票的答案,但它没有效果。
  4. How to change the default color of DatePicker and TimePicker dialog in Android? - 再也无法以类似的方式找到TimePicker。
  5. Android - How do I change the textColor in a TimePicker? - 再次,无法找到实际的TimePicker父级。
  6. 这些可能是我的问题的最佳问题/答案,但它们都没有帮助我。能够得到明确的答案真是太好了。

6 个答案:

答案 0 :(得分:21)

我已合并Paul Burke's AnswerSimon'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并未使用您可以在主题中设置的某个属性。所以你有两个选择:

  1. 复制必要的类,以制作您自己的NumberPickerTimePicker版本。 (您可以从HoloEverywhere

  2. 等库中提取某些内容
  3. 使用黑客。

  4. 如果你想走第二条路线,你可以这样做:

    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>