コード
結果から言うとこんな感じ
private void setDatePickerColor(){
//まずはダイアログのタイトルの部分のDividerの色変更
View titleDivider = getViewByIdName(null, "titleDivider");
if (titleDivider != null) {
titleDivider.setBackgroundColor(getResources().getColor(R.color.theme_green));
}
//DatePickerのDividerの色を変える
DatePicker datePicker = (DatePicker) getViewByIdName(null, "datePicker");
String[] numberPickerIdNameList = {"year", "month", "day"};
for(String numberPickerIdName : numberPickerIdNameList){
NumberPicker numberPicker = (NumberPicker) getViewByIdName(datePicker, numberPickerIdName);
setNumberPickerDividerColor(numberPicker);
}
}
private View getViewByIdName(View parentView, String idName){
int viewId = getResources().getIdentifier(idName, "id", "android");
if (parentView == null){
return dialog.findViewById(viewId);
}else{
return parentView.findViewById(viewId);
}
}
/**
* mSelectionDividerがNumberPickerのprivateとして
* 定義されている分け目のDrawableなので
* そこに対してDrawableをセットすれば色が変わる
* @param numberPicker
*/
private void setNumberPickerDividerColor(NumberPicker numberPicker){
Field[] numberPickerFields = NumberPicker.class.getDeclaredFields();
for (Field field : numberPickerFields) {
if (field.getName().equals("mSelectionDivider")) {
field.setAccessible(true);
try {
field.set(numberPicker, getResources().getDrawable(R.drawable.dialog_date_picker_divider));
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
}
タイトル部分のDividerに関して
まず、style_holo.xmlを見るとAlertDialog.Holoというスタイルに
alert_dialog_holoというLayoutがセットされているのがわかる
alert_dialog_holoを見るとタイトルのDividerのIDがtitleDividerだということがわかる。
ただ、ちょっとこの理由はわからないがandroid.R.idにはtitleDividerが無いので
android側でで定義されているidのintを引き出す必要がある。
そこで使用するのがResources.getIdentifier()。
これをこんな感じで使用する
//上記21行目
int titleDividerId = getResources().getIdentifier("titleDivider", "id", "android");
これでidが取得できるのであとはfindViewById()に突っ込むとViewが取得できる。
titleDividerはViewなので(LinearLayoutとかではない)
あとはsetBackgroundColorで色を指定するだけ。
DatePickerDialogのDividerに関して
こちらもソースを読んでいく。
まず、DatePickerDialogは単純にAlertDialogにsetView()でDatePickerを指定しているだけで
idにR.id.datePickerを指定してるのでそれでDatePickerを取得。
そしてDatePickerの中身に関してはNumberPickerを3つ並べているだけで
それぞれのidとしてyear, month, dayとつけられているので
そのidでNumberPickerを取得。
NumberPicker内にはmSelectionDividerというDrawableがprivateで指定してあって
それでDividerの描画を行っている。
privateな値なので普通には指定できないということで
Reflectionを使って設定を行います。
なおReflectionで設定しているdrawableはshapeのxmlで
単純にrectangleでsolidの色として指定しているだけ。
(うまくやれば点線とかもできるかも?)