AndroidのAlertDialogのフォントを手軽に変更するソースです。海外の端末で中華フォントしかない場合、AlertDialogのフォントの変更方法がなかなか見つからないですよね。それにAlertDialogのリストを使ったときも大変。
だから書いてみました。というか必要に迫られて便利だったので。
一応、AlertDialog内のButtonとTextView、EditTextとListViewに対応しています。
必要ならRadioButtonなども追加してみたらどうでしょうか。
あ、もちろん、いろんな人のソースを参考にしています。
//IPAゴシックをディレクトリにコピーしてから使うとき Typeface type_face = Typeface.createFromFile(getFilesDir() + "/ipaexg.ttf"); copyRawFile(this, R.raw.ipaexg, "ipaexg.ttf"); AlertDialog dialog = new AlertDialog.Builder(this) .setIcon(R.drawable.icon) .setTitle(R.string.title) .setMessage(R.string.msg) .setPositiveButton(R.string.yes,new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); finish(); } }) .setNegativeButton(R.string.no,new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } }) .create(); dialog = set_dialog_font(this,dialog,type_face); dialog.show(); //Rawからフォルダにコピー public void copyRawFile(Context context, int resourceId, String fileName) { InputStream input = null; OutputStream output = null; try { input = context.getResources().openRawResource(resourceId); output = context.openFileOutput(fileName, Context.MODE_PRIVATE); byte[] buff = new byte[1024*4]; int size = 0; while((size = input.read(buff)) >= 0) { output.write(buff, 0, size); } output.flush(); output.close(); input.close(); output = null; input = null; }catch(Exception e) { try { if(output != null) output.close(); if(input != null) input.close(); }catch(Exception e2){ } } } //子要素のフォントを変更 private void overrideFonts(final Context context, final View v ,Typeface type) { try { if (v instanceof ViewGroup) { ViewGroup vg = (ViewGroup) v; for (int i = 0; i < vg.getChildCount(); i++) { View child = vg.getChildAt(i); A_PointSystem.overrideFonts(context, child,type); } } else if (v instanceof EditText || v instanceof TextView || v instanceof Button) { ((TextView) v).setTypeface(type); } } catch (Exception e) { e.printStackTrace(); } } //AlertDialogの要素を変更 private AlertDialog set_dialog_font(final Context context,AlertDialog alertDialog ,Typeface type){ alertDialog.setOnShowListener(new OnShowListener() { @Override public void onShow(DialogInterface alert) { Button bt0 = ((AlertDialog)alert).getButton(Dialog.BUTTON1); Button bt1 = ((AlertDialog)alert).getButton(Dialog.BUTTON2); Button bt2 = ((AlertDialog)alert).getButton(Dialog.BUTTON3); if(bt0!=null){bt0.setTypeface(TitleActivity.g_type_face);} if(bt1!=null){bt1.setTypeface(TitleActivity.g_type_face);} if(bt2!=null){bt2.setTypeface(TitleActivity.g_type_face);} Window w = ((AlertDialog)alert).getWindow(); View v = w.getDecorView(); if(v!=null){ overrideFonts(context,v,TitleActivity.g_type_face); } ListView listView = ((AlertDialog)alert).getListView(); if(listView==null) return; final ListAdapter originalAdapter = listView.getAdapter(); listView.setAdapter(new ListAdapter() { @Override public int getCount() { return originalAdapter.getCount(); } @Override public Object getItem(int id) { return originalAdapter.getItem(id); } @Override public long getItemId(int id) { return originalAdapter.getItemId(id); } @Override public int getItemViewType(int id) { return originalAdapter.getItemViewType(id); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = originalAdapter.getView(position, convertView, parent); TextView textView = (TextView)view; textView.setTypeface(type_face); return view; } @Override public int getViewTypeCount() { return originalAdapter.getViewTypeCount(); } @Override public boolean hasStableIds() { return originalAdapter.hasStableIds(); } @Override public boolean isEmpty() { return originalAdapter.isEmpty(); } @Override public void registerDataSetObserver(DataSetObserver observer) { originalAdapter.registerDataSetObserver(observer); } @Override public void unregisterDataSetObserver(DataSetObserver observer) { originalAdapter.unregisterDataSetObserver(observer); } @Override public boolean areAllItemsEnabled() { return originalAdapter.areAllItemsEnabled(); } @Override public boolean isEnabled(int position) { return originalAdapter.isEnabled(position); } }); } }); return alertDialog; }