AlertDialogテキスト内容の色を変更


最近、レノボA 858 Tの白い携帯電話で次のようなAlertDialogをテストしたとき、AlertDialogの背景はデフォルトで白で、title、messageは黒だったが、CheckBoxのTextは白だった.
final CheckBox cb = new CheckBox(this);
            cb.setChecked(false);
            cb.setText(getResources().getString(R.string.close_wifi_switch));
            dialog = new AlertDialog.Builder(this)
                    .setTitle(getResources().getString(R.string.exit_wimo_sure))
                    .setView(cb)
                    .setNegativeButton(R.string.cancel,
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int whichButton) {
                                    // Do nothing.
                                }
                            })
                    .setPositiveButton(R.string.exit,
                            new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog,
                                        int whichButton) {
                                   
                                }
                            }).create();
            dialog.show();

したがって、AlertDialogのtitle色値を反射法で読み取ってCheckBoxのTextColorに付与できるかどうかを考え、関連するAlertControllerクラスをネット上で見つけた.このクラスはAlertDialogの実装クラスであり、公開されていない.そして、このクラスにmTitleViewというプライベートメンバー変数があり、これがAlertDialogのtitleのTextViewであるため、このメンバー変数の例を得る限り、titleの色値が得られます
 dialog.show();//  , 
        try {
            Field mAlert = AlertDialog.class.getDeclaredField("mAlert");
            mAlert.setAccessible(true);
            Object alertController = mAlert.get(dialog);
            Field mTitleView = alertController.getClass().getDeclaredField(
                    "mTitleView");
            mTitleView.setAccessible(true);
            TextView title = (TextView) mTitleView.get(alertController);
            ColorStateList colorStateList = title.getTextColors();
            cb.setTextColor(colorStateList);
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

チェックボックスのText色を変更するのと同じように、AlertDialogのtitleフォントの色を直接変更することもできます.setTextColor(XXXXX)