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]