AndroidのAlertDialogのフォント

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;
}

イラスト利用規約

イラストは規約を遵守することでご利用いただけます。
なお、著作権は放棄しておりません。

<利用する際に必要な条件>
下記のクレジットとリンクを制作物に記載すること
・クレジット:(C)声で応援 Illustrated by 羊ラジオ
・リンク先:http://www.gamekozo.com/illust

<利用を許可されるもの>
・無償・有償問わずご利用いただけます。
・アプリやソフトウェアに利用していただけます。
・HPやアイコンとして利用いただけます。
・印刷物に利用いただけます。

<利用を許可しないもの>
・二次配布すること。
・イラストそのものを販売すること、またはそれに類すること。
・自らのイラストと偽ること。
・グロテスク・わいせつな表現・露骨な性描写の内容・写真を含むものやそれに準ずるものに使用すること。
・暴力的な表現および人種、性別、宗教、国籍、身体障害、性的嗜好または年齢による差別を含むものやそれに準ずるものに使用すること。
・公序良俗・法令などに違反する内容を含むものやそれに準ずるものに使用すること。
・政治的志向の強いものに利用すること。

<免責事項>
・イラストをご利用になることにより発生するトラブルなどに関しましては当方は責任を持ちません。
・利用規約は当方の裁量で更新できるものとします。

×