2009年11月19日木曜日

LDReader 記事詳細の WebView をちょっと修正したり

LDReader 0.0.9 をリリースしました。
・記事詳細の WebView でリンクをクリックしたときにダイアログ表示
・ProgressDialog の表示後の処理を修正

記事詳細の WebView でリンクをクリックしたときにダイアログ表示

記事詳細では間違ってリンクをクリックしてしまってブラウザが起動してしまい、非常にストレスを感じていましたが確認用のダイアログを表示することで少し軽減されるようにしました。ソースはこちら。
// NOTE: WebView#setWebViewClient を使用
bodyView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, final String url) {
// NOTE: 設定でリンクを無効にした場合はそのまま終了
if (ReaderPreferences.isDisableItemLinks(getApplicationContext())) {
return true;
}
// NOTE: ダイアログ表示
new AlertDialog.Builder(ItemActivity.this)
.setTitle(R.string.msg_confirm_browse)
.setMessage(url)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// NOTE: OK がおされたら Intent を発行
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
})
.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
}).show();
return true;
}
});

WebViewClient#shouldOverrideUrlLoading は true を返すことで、WebView の標準を動きをオーバーライドすることができます。

ProgressDialog の表示後の処理を修正

ProgressDialog を表示後に Handler#post を使っていた箇所をすべて Thead を使うようにしました。
実はここ、最初は Thread だったんですが Handler は post の他に postDelayed という遅延実行のメソッドも持っており、Thread のような動きをするので、「あ。こっちでいいのか」とつい思い込みをしてました。

意図しているのは
   プログレスバー表示

重い処理

終了

だったんですが、Handler#post を使うと
   重い処理

プログレスバー表示(一瞬)

終了

になっちゃいます。

ここに詳しい解説がのってました!
http://www.adamrocker.com/blog/261/what-is-the-handler-in-android.html

// NOTE: 修正前
final Handler handler = new Handler();
final ProgressDialog dialog = new ProgressDialog(this);
dialog.show();
handler.post(new Runnable() {
public void run() {
// NOTE: ここで遅い処理
// (some code)
// NOTE: 終わったら ProgressDialog を閉じる
handler.post(new Runnable() {
public void run() {
dialog.dismiss();
}
});
}
});

// NOTE: 修正後
final Handler handler = new Handler();
final ProgressDialog dialog = new ProgressDialog(this);
dialog.show();
new Thread() {
public void run() {
// NOTE: ここで遅い処理
// (some code)
// NOTE: 終わったら ProgressDialog を閉じる
handler.post(new Runnable() {
public void run() {
dialog.dismiss();
}
});
}
}.start();

0 件のコメント: