1 您可以使用元素中的android:windowSoftInputMode属性在IME 弹出时在各种调整大小策略中进行选择。这些包括(不限于):<activity>
Manifest.xml
adjustResize
,这将调整您的 Activity 的内容视图(以及其中的 WebView)以适应剩余空间。
adjustPan
,这将使内容视图充满整个屏幕,部分被 IME 的窗口遮挡。
玩这些可能已经给你你正在寻找的行为。
2 Android 在 IME 弹出时滚动 (Web)View 的默认行为是它试图保持光标可见。在您的情况下,您将光标(或:焦点)放在隐藏视图上。这解释了你看到的奇怪行为,我认为你最好改变你的实现。你为什么不首先使用可见的文本区域?您的文本必须在某个地方结束,对吗?然后 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 的高度。