1要素内でandroid:windowSoftInputMode属性を使用して、IME がポップアップしたときにさまざまなサイズ変更方法を選択できます。これらには以下が含まれます (これらに限定されません)。<activity>
Manifest.xml
adjustResize
これにより、Activity のコンテンツ ビュー (およびその中の WebView) のサイズが変更され、残りのスペースに収まるようになります。
adjustPan
これにより、コンテンツ ビューが画面全体に表示され、IME のウィンドウによって部分的に遮られます。
これらをいじると、探している動作がすでに得られる場合があります。
2 IME がポップアップしたときに (Web)View をスクロールするときの Android のデフォルトの動作は、カーソルを表示したままにしようとすることです。あなたの場合、非表示のビューにカーソル (またはフォーカス) を置いています。これは、あなたが目にしている奇妙な動作を説明しており、実装を変更することをお勧めします。そもそもなぜ可視テキストエリアを使用しないのですか? あなたのテキストはどこかに行き着く必要がありますよね?そして、Android はフォーカス/スクロールを自動的に処理します。
回避策として、非表示のビューをよりスマートに配置し、その内容を時々クリアして、スクロールの問題を回避することを試みることができます。もちろん、このオプションの実行可能性は、正確なユース ケースによって異なります。
3 これがあなたの質問に対する答えになりますが、これがどのように役立つかわかりません (おそらく、HTML の経験が浅いためです):
JavaScript で WebView の高さ (画面サイズ - IME の高さ) を取得するには、次の手順を実行します。
- マニフェストで、
android:windowSoftInputMode="adjustResize"
要素に属性を追加します。
次のように外側のレイアウトを拡張します。
public class RelativeLayoutWithLayoutListener extends RelativeLayout {
public interface LayoutListener {
public void onLayout();
}
private LayoutListener mListener;
public RelativeLayoutWithLayoutListener(Context context) {
super(context);
}
public RelativeLayoutWithLayoutListener(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public RelativeLayoutWithLayoutListener(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void setLayoutListener(LayoutListener aListener) {
mListener = aListener;
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if (mListener != null) {
mListener.onLayout();
}
}
}
古いレイアウトを、layout.xml ファイルで新しく作成したレイアウトと交換します。
アクティビティ コードで、次のようにします。
public class MainActivity extends Activity {
private RelativeLayoutWithLayoutListener mMainLayout;
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMainLayout = (RelativeLayoutWithLayoutListener)findViewById(R.id.main_layout);
mMainLayout.setLayoutListener(new LayoutListener() {
@Override
public void onLayout() {
mWebView.loadUrl("javascript:setSize(" + mMainLayout.getWidth() + "," + mMainLayout.getHeight() + ")");
}
});
mWebView = (WebView)findViewById(R.id.webview);
}
}
もちろん、loadUrl() 呼び出しでは、定義した JavaScript メソッドを呼び出す必要があります。もちろん、最初に計算を行う場合は、IME の高さを渡すこともできます。