2014-09-24 228 views
7

我一直在嘗試更改我的timepicker的textcolor。但是我找不到父母的位置。我都試過更改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.我已經rebuilded和清理我的項目。
我想我已經通過了所有關於SO的類似問題,並沒有一個真的爲我提供瞭解決方案。可能工作的唯一答案是使用某種圖書館,但我不是那種解決方案的忠實粉絲。父母的路徑與我使用的路徑有什麼不同,因爲我很確定我應該能夠以某種方式訪問​​它?

編輯
這就是主題如何應用;

​​

在一張紙條,這是我收到的錯誤(忘記之前把它):

Error:Error retrieving parent for item: No resource found that matches the given name '@android:style/Widget.Holo.TimePicker'.

編輯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父級。

這些可能是我的問題的最佳問題/答案,但他們都沒有幫助我。這將是很好的,得到一個明確的答案。

+0

第一種風格應該工作,你是如何應用這種風格的? – pskink 2014-09-24 11:51:50

+0

@pskink更新了答案 – Bono 2014-09-24 11:56:10

+0

試過[this](http://stackoverflow.com/a/21361885/3249477)? – Simas 2014-09-27 13:41:36

回答

20

我組合了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); 
     } 
    } 
} 
+2

這對我有效。方便的小實用程序。 – 2014-10-31 15:57:52

+1

java.lang.NullPointerException:嘗試在空對象引用上調用虛擬方法'int android.widget.NumberPicker.getChildCount()'。final int count = number_picker.getChildCount (); – 2015-05-18 09:05:20

+0

@voidpointer如果你還有其他問題,請使用屏幕右上方的「問問題」按鈕,你有什麼是純空指針例外。 – Bono 2015-05-18 09:21:44

3

A TimePicker實際上只是兩個NumberPicker s。展望Widget.NumberPicker風格和佈局,你會發現它使用

@style/TextAppearance.Large.Inverse.NumberPickerInputText 

不幸的是,TextAppearance.Large.Inverse.NumberPickerInputText不使用,你可以在你的主題設置的屬性之一。所以,你有兩個選擇:

  1. 複製必要的類,使自己的NumberPickerTimePicker版本。 (你可以從圖書館中提取一些東西,如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)。

+0

謝謝Paul「黑客」對我來說看起來很好。儘管我有幾個問題;我如何獲取上面和下面的數字以更改顏色?當我旋轉/改變旋鈕(選擇一個不同的數字)時,它們會默認回到黑色。我如何防止這種情況? – Bono 2014-09-27 16:06:39

+0

@Bono請看我更新的答案。看起來像選項1可能是正確控制這一點的唯一方法。 :-( – 2014-09-27 22:34:41

4

不知道爲什麼你需要潛入Java反射API這一點。它是一個簡單的造型問題。您需要覆蓋的屬性是:textColorPrimary

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

如果您使用的TimePicker一個Dialog內,覆蓋在對話的主題android:textColorPrimary

就是這樣。

+0

問題是它不能夠' t找到'Theme.Holo.Light'父母,這就是文字顏色無法改變的原因。不幸的是,你的答案是關於某個東西有點不同。我會盡快編輯我的問題來描述這一點。 – Bono 2015-04-29 14:28:00

+0

@Bono不知道爲什麼它找不到'Theme.Holo.Light'。但父母在這裏無關緊要。你應該保持父母的身份,最可能的是'Theme.AppCompat [.Light]'。 – Vikram 2015-04-29 22:04:22

+0

@Bono更多信息:提供'TimePicker'文本顏色的'attr'是'textColorPrimary'。所以,我們可以通過覆蓋這個attr來改變文本的顏色。但是,這個attr也被用作所有'TextViews'的默認文本顏色。意思是,如果你不提供'android:textColor =「@ color/some_color」'_,它將使用'textColorPrimary'。最簡單的方法是使用'ContextThemeWrapper'在java中創建'TimePicker'。看到這個問題已經很老了,我感謝你的評論。如果您需要使用'ContextThemeWrapper'的工作示例,請告訴我。 – Vikram 2015-04-29 23:41:27