webviewClientを実装した状態で、外部ブラウザを開く

2,437 views
Skip to first unread message

mun

unread,
Mar 31, 2014, 7:50:34 AM3/31/14
to android-g...@googlegroups.com
こんにちは。
webViewではまってしまい質問させていただきました。

現在、ローディングアイコンを表示するために、webviewClientをつかったwebViewアプリを実装しています。
ただし、このwebViewのURLリンクをタップしたときは外部ブラウザを立ち上げたいと思っているのですが、
webviewClientを実装すると、アプリ内部でURLページ遷移するようになるため、外部ブラウザの立ち上げがうまく
いきません。(下記srcで実現できている風なのですが、画面がちらつくのです)

何か良い方法をご存知の方いらっしゃいませんでしょうか?

以下、プログラムです。
ご指摘やアドバイスがあればコメントください。
よろしくお願いします。

以下src
==========
public class AHFaqItemDetailActivity extends Activity {
/** WebView */
private WebView webView;

/** ダイアログオブジェクト */
private ProgressDialog dialog;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ah_faq_itemdetail_actityty);
        
// 遷移もとからタイトルに表示する文字列を受け取る
Intent intent = getIntent();
final String answerText = intent.getStringExtra("ANSWER");//HTML文字列
webView = (WebView)findViewById(R.id.ah_faq_itemdetail_actityty_webview);
webView.setWebViewClient(new WebViewClient(){

//読み込み開始
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon){
super.onPageStarted(view, url, favicon);

//httpから始まらない文字列は(※answerTextはhttpからはじまらないのでこの条件で分岐)
if(url.substring(0, 4).equals("http")){
//自分のアプリはそのままにして
webView.loadData(answerText, "text/html; charset=UTF-8",null);//←ここで画面がちらつく。でもこれをやらないとアプリ内で遷移しちゃう
//ブラウザ起動
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(url));
startActivity(intent);
}else{
//ダイアログ表示
if(dialog!=null){
dialog.show();
}
}
}
//読み込み完了
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.d(LOG_TAG,":WebView onPageFinished実行");
//ダイアログ削除
if(dialog!=null){
dialog.dismiss();
}
}

});
//プログレスダイアログを表示
dialog = new ProgressDialog(AHFaqItemDetailActivity.this);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setCancelable(true);
//HTMLデータ読み込み
webView.loadData(answerText, "text/html; charset=UTF-8",null);
}

Shin Miyazaki

unread,
Apr 1, 2014, 4:52:31 AM4/1/14
to android-g...@googlegroups.com
こんにちは、みやざきです。

onPageStartedは「読み込み始めました」という合図でしかないので、まあそんなものです。

shouldOverrideUrlLoadingを使えば、読み込むURLを横取りしたうえでWebViewへの読み込みを抑制できますよ。
一点制限はありますが、それはAPIの解説をよく読んでください。


2014年3月31日 20:50 mun <st57...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

mun

unread,
Apr 1, 2014, 7:34:46 AM4/1/14
to android-g...@googlegroups.com
みやざきさん

ありがとうございます。
shouldOverrideUrlLoadingはつかってみました。
Webリンクを踏んだときよばれるにこのメソッドが呼ばれるので、URLを踏んだことはキャッチできるのですが、
WebViewへの読み込み制御ができず、結局 踏んだリンク先に飛んでしまうのです。
(ちなみにWebリンクを踏むだけなので、APIに記載してあった制限である”POSTメソッド”は利用しません)

>shouldOverrideUrlLoadingを使えば、読み込むURLを横取りしたうえでWebViewへの読み込みを抑制できますよ。
もしよろしければその制御方法を教えていただけませんか?


2014年4月1日火曜日 17時52分31秒 UTC+9 shinm:
このグループから退会し、グループからのメールの配信を停止するには android-group-japan+unsub...@googlegroups.com にメールを送信してください。

田代透

unread,
Apr 1, 2014, 7:45:20 AM4/1/14
to android-g...@googlegroups.com
おーばーらいど?

調べれば答えがずらずらと出てくるみたいなのだけど…


2014年4月1日 20:34 mun <st57...@gmail.com>:
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。

このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
--
Toru Tashiro
toru...@gmail.com

mun

unread,
Apr 1, 2014, 10:49:52 PM4/1/14
to android-g...@googlegroups.com
Toruさん
レスありがとうございます。

基本的には、WebViewClientの各メソッドをオーバーライドしています。(@Override部分)
そのことでしょうか?

それとも、shouldOverrideUrlLoadingのことをおっしゃっていますか?

いずれにしてもどちらも試していると記載していたのですが。。。


2014年4月1日火曜日 20時45分20秒 UTC+9 Toru:
おーばーらいど?

調べれば答えがずらずらと出てくるみたいなのだけど…



2014年4月1日火曜日 17時52分31秒 UTC+9 shinm:
このグループから退会し、グループからのメールの配信を停止するには android-group-japan+unsubscribe...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。

http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。

--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-japan+unsub...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
http://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
--
Toru Tashiro
toru...@gmail.com

Shin Miyazaki

unread,
Apr 1, 2014, 11:59:29 PM4/1/14
to android-g...@googlegroups.com
> もしよろしければその制御方法を教えていただけませんか?

API解説の最後の文以外も読みましたか?


2014年4月1日 20:34 mun <st57...@gmail.com>:
みやざきさん
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。

mun

unread,
Apr 2, 2014, 12:48:58 AM4/2/14
to android-g...@googlegroups.com
みやざきさん

ご指摘ありがとうございます。
解決しました。

WebViewClient のリファレンスの
#public boolean shouldOverrideUrlLoading (WebView view, String url)

の返り値の部分
Returns
True if the host application wants to leave the current WebView and handle the url itself, otherwise return false.
→True:アプリのカレントWebViewに留まる、False:それ以外。(←つたないですが。。)

恥ずかしながらここの確認が漏れていました。
大変失礼しました。

ありがとうございました。

2014年4月2日水曜日 12時59分29秒 UTC+9 shinm:
> もしよろしければその制御方法を教えていただけませんか?

API解説の最後の文以外も読みましたか?

mun

unread,
Apr 2, 2014, 12:55:24 AM4/2/14
to android-g...@googlegroups.com
解決しましたのでsrc記載しておきます。
みなさんご協力ありがとうございました。

src
(※読み込み失敗時の処理などは記載しておりませんのでご注意ください)
===============================
package、import 略

public class AHFaqItemDetailActivity extends Activity {
/** WebView */
private WebView webView;

/** ダイアログオブジェクト */
private ProgressDialog dialog;
/** Webサイトフラグ */
private boolean isWebSite =false;
/**
 * {@inheritDoc}
 */
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.ah_faq_itemdetail_actityty);
        
// 遷移もとからタイトルに表示する文字列を受け取る
Intent intent = getIntent();
final String answerText = intent.getStringExtra("ANSWER");//HTML文字列
//WebView設定
webView = (WebView)findViewById(R.id.ah_faq_itemdetail_actityty_webview);
webView.setWebViewClient(new WebViewClient(){

//Webリンク読み込み時
@Override
public boolean  shouldOverrideUrlLoading( WebView view,String url) {
super.shouldOverrideUrlLoading(view, url);

isWebSite=true;

//外部ブラウザ起動
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse(url));
startActivity(intent);
return true;//←カレントWebViewに留まる(=この後のonPageStarted()、onPageFinished()は呼ばれない、retrun falseにすると呼ばれる)
}
//読み込み開始
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon){
super.onPageStarted(view, url, favicon);
if(!isWebSite){
//ダイアログ表示
if(dialog!=null){
dialog.show();
}
}
}
//読み込み完了
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
Log.d(LOG_TAG,":WebView onPageFinished");
//ダイアログ削除
if(dialog!=null){
dialog.dismiss();
}
isWebSite = false;
Reply all
Reply to author
Forward
0 new messages