Android1.6、Android2.1のWebViewで、タッチイベントがまれに反応しない
先週、WebViewで、タッチイベントを拾ってくれない症状が起こって困りはてておりました。Android1.6は様々な問題がありますね、ほんとに。
端末の画面上では、オレンジ色になっているので、タッチイベントを拾ってくれているかと思いきや、まったく反応してくれない。
タッチイベントを拾ってくれないということは、次のページのリンクに進んでくれない。。そして何よりJavascriptのonclick,ontouchstart,ontouchendのイベントすらすべて拾ってくれない!!
本当にひどいですね、この仕様。
下の画像のように、オレンジ色になるのでタッチ認識しているかと思われるのですが、そうはいかないみたいっす。
(タッチした部分はオレンジ色になるのですが、タッチを検出してくれず、タッチ先のページへ進んでくれません。)
今日は、日本語の情報が皆無だったので、その解決方法をご紹介。
サンプルWebViewアプリ
import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.view.KeyEvent; import android.view.Window; import android.webkit.WebChromeClient; import android.webkit.WebView; import android.webkit.WebViewClient; public class MainActivity extends Activity { WebView webView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getWindow().requestFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.main); webView = (WebView) findViewById(R.id.webview); webView.loadUrl("http://www.google.co.jp/webhp?hl=ja"); webView.setWebViewClient(new WebViewClientDemo()); //WebViewClientを設定 webView.setWebViewClient(new WebViewClient() {}); //javascriptを有効にする webView.getSettings().setJavaScriptEnabled(true); //javascriptのalert拾えるように webView.setWebChromeClient(new WebChromeClient()); } private class WebViewClientDemo extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); return true; } @Override public void onPageStarted(WebView view, String urlString, Bitmap favicon) { super.onPageStarted(view, urlString, favicon); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); } } // キー押下時 @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) { // 戻るボタン押下時 if (webView.canGoBack()) { webView.goBack(); } else { this.finish(); } return true; } return super.onKeyDown(keyCode, event); } }
原因
何故かはわかりませんが、
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <WebView android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" /> </LinearLayout>
layout.xmlで、
andoroid:layout_height="wrap_content"
としていることが原因ですw
なんでなんだかはよくわかりません。。
解決策
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <WebView android:id="@+id/webview" android:layout_width="fill_parent" android:layout_height="0px" android:layout_weight="1" /> </LinearLayout>
android:layout_height="0px"
とすると直ります。
解決方法すら笑えてきしまいますが、これで本当に問題は起こらなくなりました。
Javascriptのタッチイベントはもちろん、リンクも正常に拾ってくれます。