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のタッチイベントはもちろん、リンクも正常に拾ってくれます。