LoginSignup
0
1

More than 5 years have passed since last update.

Android4.0でDatePickerDialogのDividerの色を変更する方法

Posted at

コード

結果から言うとこんな感じ

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の色として指定しているだけ。
(うまくやれば点線とかもできるかも?)

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1