WebView を表示する Activity で、マニュフエストに
android:windowSoftInputMode="adjustPan"
を書いている場合!
WebViewで表示するページ、入力フィールドが大量に配置されたり、
HTMLページデザインが悪く入力フィールドのサイズが小さかった場合、
キー入力をしようとタップして文字を入れ始めると入力フィールド以外が真っ白、
あるいは真っ黒になりその後、回復せず画面が崩れたまま使えなくなる。
これは、Androdid 4.0 で発生率が高くなる。
android:windowSoftInputMode="adjustPan" を書かなければこの現象は起きにくい。
過去、「Android 3.2 WebView 画面がネガポジ反転する?」
http://blog.zaq.ne.jp/oboe2uran/article/642/
で書いたように、
Android のハンズセット Project の issue にある
http://code.google.com/p/android/issues/detail?id=20446
の場合などもこの adjustPan を書いたことで発生した現象の1つである。
Android4.0で、この反転だけを
http://blog.zaq.ne.jp/oboe2uran/article/665/
で書いたように、ハードウェアアクセラレータを有効にすると
反転黒から白くなるだけで、adjustPan を書いてしまう以上、
キー入力時の描画で画面が崩れてしまいます。
悩んだあげく以下の方法で凌ぐことにした。
drawable の下に、fiting.png という透明画像を配置してレイアウト一番下に配置
<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#808080" >
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/fiting"
android:background="#808080" />
</LinearLayout>
グローバル変数で、このレイアウトを保持、表示状態のフラグを持つ
View fitingLayout;
boolean isDisplayFiting = false;
Activity の onCreate で、
fitingLayout = findViewById(R.id.linearLayout2);
fitingLayout.setVisibility(View.GONE);
WebView にセットするWebViewClient で、onScaleChanged で WebView の画面
スケール変更が発生した時に用意した透明画像のレイアウトを表示したり隠すことで
画面の再描画を走らせて崩れるのを防ぐ。
setWebViewClient(new WebViewClient(){
@Override
public void onScaleChanged(WebView view,float oldScale,float newScale){
super.onScaleChanged(view,oldScale,newScale);
fitingLayout.setVisibility(isDisplayFiting ? View.VISIBLE : View.GONE);
isDisplayFiting = !isDisplayFiting;
}
});
透明画像レイアウトを一番下に配置することで、
android:windowSoftInputMode="adjustPan" の記述で
ソフトキーボードが 上に被さるので透明画像レイアウトは見えない。
さらに、通常のページの拡大率の変更操作でも一番下に表示されるレイアウト1pixel
ならさほど気にならない