こんにちは、フジロックでデジカメなくしたらしいhidakaです。
気に入ってたのにな、サイバーショット。。

さて、凹みつつもお仕事。
あのAndroidのプログレスダイアログ、変えたいと思ったことはありませんか?
機種によっていろいろですが、だいたいくるくるしてて、メッセージがでてる感じのアレです。

これまで、思い切りデザインいれたいなーという時はActivityを透過させて使ったりしていたんですが、
それだと元の画面でonResume,onPauseとか呼ばれちゃうし嫌だなぁって。
そんなわけでちゃんとダイアログをカスタムして整理する方法を調べました。

プログレスダイアログをカスタムと言いましたが、カスタムするのはその親のDialogです。
いじるなら素のほうってわけで。なので実は普通のアラートダイアログなんかも同じやり方。
まずはDialogクラスにテーマを設定してnewします。
意外とnewする時にいろいろつけられたりできるクラスは多いので注意してみましょう。


Dialog pDialog = new Dialog(this,android.R.style.Theme_Translucent_NoTitleBar);

次は、自分で作ったレイアウトXMLを指定します。
Activity内でレイアウトのパーツ使う時なんかのLayoutInflater です。

LayoutInflater inflater = LayoutInflater.from(ctx);
final View loadingV = inflater.inflate(R.layout.loading_circle,null);

そしてDialogにいま読み込んだviewを設定します。

pDialog.setContentView(loadingV);

あとは表示するだけ。


まとめるとこうなります。


Dialog pDialog = new Dialog(this,android.R.style.Theme_Translucent_NoTitleBar);
LayoutInflater inflater = LayoutInflater.from(ctx);
final View loadingV= inflater.inflate(R.layout.loading_circle,null);
pDialog.setContentView(loadingV);
pDialog.show();

さらに、くるくるのアニメーションをいれたい場合なんかはこんな感じ。
レイアウトXML(loading_circle)に置いたImageView(iv_kurukuru)に設定したAnimationDrawable(コマアニメXML)をスタートさせる処理です。

LayoutInflater inflater = LayoutInflater.from(ctx);
final View loadingV = inflater.inflate(R.layout.loading_circle,
null);
ImageView iv_kuru = (ImageView) loadingV.findViewById(R.id.iv_kurukuru);
final AnimationDrawable anim = (AnimationDrawable) iv_kuru.getBackground();
iv_kuru.post(new Runnable() {
public void run() {
anim.start();
}
});
Dialog pDialog= new Dialog(this,android.R.style.Theme_Translucent_NoTitleBar);
pDialog.setContentView(loadingV);
pDialog.show();

HTML5飯