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

フォントが

とても素敵なフォントを利用させていただいてたのですが、どうもおかしい。文字を表示する時に微妙にひっかかるんです。で、フォントを規定のものに戻してみるとひっかからない。
どこに違いがあるんだろう?
綺麗なほうを優先したいんだけど引っかかるのはやっぱり良くないから、今回は規定のものを利用しよう。
いずれこの問題がわかったら素敵なフォントを利用させてもらおうと思います。

フォントって

フォントってiPhoneに入ってるのものすごくチープなので嫌だな〜と思ってるんですよ。で、商用可能なフリーフォントも検討させていただいていてアイコンのデザインには使わせていただいています。
ところが本当に必要なところに使えるのがないんですよね。
ウルトラボールドより太いボールドが欲しいんだけど、さすがにそれは商用可能なものが見つからないので自分で作るかな。
いまはInkscapeで作った自作のフォントを画像として使ってます。
TrueTypeにしようかなあ。そうしたら文字の色を自由に変えることができるよね。
まあ、大事なところではないから急ぐ必要はないんだけどね。
FontForgeを試してみたけど良く落ちるんだよね。
やっぱりTTEditの会社のOpenType用のシステムを買う?
できがいいから1本は持っておいていいと思うんだけど。
でも数字だけだからな〜
最初は画像であとから考えようか。う〜ん。う〜ん。

Webフォント

Webフォントのテストをしています。ちゃんと表示されるかな?

Mac OSX LionからSafariでWOFF形式が利用できるようになるそうですね。
それならWebフォントも他のブラウザと共通で使えるから普及するかな?ということで実験させていただきました。

一応、Chrome dev 14とSafari(TrueTypeで対応)ではちゃんと表示されたみたいです。