AndroidのAlertDialogのフォント

AndroidのAlertDialogのフォントを手軽に変更するソースです。海外の端末で中華フォントしかない場合、AlertDialogのフォントの変更方法がなかなか見つからないですよね。それにAlertDialogのリストを使ったときも大変。
だから書いてみました。というか必要に迫られて便利だったので。
一応、AlertDialog内のButtonとTextView、EditTextとListViewに対応しています。
必要ならRadioButtonなども追加してみたらどうでしょうか。

あ、もちろん、いろんな人のソースを参考にしています。

[java]
//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;
}
[/java]

Androidと日本語

iPhoneのとても優れている点は世界中のフォントが入っているということです。といっても主要なものだけですが。
ですので翻訳すればほぼ表示されます。
でもAndroidはそのメーカーによって対応している言語が違います。
日本で発売しているものは当然日本語フォントが入っていますが、海外で購入するものは日本語は入っていません。
ということは海外で発売しようとしているものを日本語に対応させるようにするには日本語フォントを組み込むしかないんですね。
そうしないと文字化けして読めなくなります。
ところが、日本の端末でテストしても本当に大丈夫?なのかがわからないんですよね。
中国語が入っていたら中国語に代替えされちゃうから分かりにくいし。
GoogleさんのNexus7はほぼiPhoneと同じように世界中を網羅しているんですけどみんなそんなことはないので。
完全にアジア圏の文字が入っていないAndroidが欲しいなあ。どんなふうに表示されるんだろう。

AndroidやiPhoneで

AndroidやiPhoneでオーストラリアやカナダの人はどのロケールを選ぶんだろう?English(United States)、English(United Kingdom)?
ケベックはFrancais?
う〜んう〜んわかんないよ。

Android系のアプリが

Android系のアプリがiPhoneよりも開発者を増やしたいならアフィリエイトを利用するべきだと思っています。
iPhoneは誰も彼もがお勧めしていますし、お勧めのサイトが多いと思うのですがこれは「アフィリエイト」での収益が見込めるからですよね。
もし、Amazonで発売するAndroid系のアプリが今のAmazonのようにアフィリエイト対応になるならきっと市場は開拓されると思うんです。
Amazonならやってくれるんじゃないかな?って期待してるんですけどね。
そうすることでアプリの露出の機会も増えるんですよね。
もしそうなったら、研究用に作っているAndroid系のアプリを簡単に紹介できるツールを無料配布できるんだけどなあ。iPhone版以上にできがいいのを。
Windows用のソフトですよ。

Androidって

Androidってやっぱり画面が作りにくくてそれだけで損をしているような気がするんですよ。で、ちょっとレイアウト失敗したらクラッシュ!!おかしいよね。事務的な画面は作りやすいけどやっぱり面倒。
かと言ってSurfaceViewとかOpenGLで描くのもなんだか面倒で。
Androidのコードは内部的な処理だけにして画面周りは他のソフトを使って作れないかな〜なんて思ってたら、FlashがAndroidやiOS対応をして、それでもやっぱり使いにくかったんだけど最近のAirはAir自体を内包できるようになったからもう怖いものなし。ANEを作ってコードはAndroidにさせて画面はFlashにという構造ができるわけです。
処理速度も著しく向上したしこれからの新作はFlashでほとんど作ろうかななんてね。
これからフクロウさんも猫さんも犬さんも虎さんも違う展開に持って行きたいところもあるし、それはFlashで制作してiOSやAndroidへリリースしていこうと思っています。

また、前からずっと言い続けているけれど知育系をやりたいのでそれにもFlashはぴったりで。
売ることよりも「親のケータイで読んだなんかちっちゃな灰被り」を実現したくて。それを可能にするのはこれかな?と思っていろいろやっているわけです。
僕は亀よりも動きが遅いのでなかなか進まないけどね。
でもね一つだけ自慢できるところがあるとしたら僕はあきらめないんです。自分が心からやりたい!(*ここ重要)と決めたことはね。やりたくない!ナンセンスと思うものはすっぱりやめるけど(笑)
だから長い目で見てくれるとうれしいな。

そこで|ω・)チラ【宣伝】Adobe AIR Content 2012に「声で応援 Air版」でエントリーさせていただいています〜。見てね〜