我创建了一个简单的iPhone/Android应用程序,包含一个常规的Web视图。这个Web视图调用我的网站。
在我的网站上有几个表单,其中包含文本输入框或文本区域。当它们位于页面底部时,我遇到了一个问题!
1)在我的iPhone应用程序中,键盘会自动出现并将文本框推送到手机屏幕的可见区域。所以什么也不用做。
2)但在我的Android应用程序中,文本框将保持在原地,并最终被键盘隐藏。因此,用户唯一的选择是“盲打”。
如何解决这个问题?有其他人遇到过这个问题吗?
我创建了一个简单的iPhone/Android应用程序,包含一个常规的Web视图。这个Web视图调用我的网站。
在我的网站上有几个表单,其中包含文本输入框或文本区域。当它们位于页面底部时,我遇到了一个问题!
1)在我的iPhone应用程序中,键盘会自动出现并将文本框推送到手机屏幕的可见区域。所以什么也不用做。
2)但在我的Android应用程序中,文本框将保持在原地,并最终被键盘隐藏。因此,用户唯一的选择是“盲打”。
如何解决这个问题?有其他人遇到过这个问题吗?
这是我解决问题的方法。正如Venky所说,您必须添加
android:windowSoftInputMode="adjustResize"
在AndroidManifest.xml文件中添加标签是不够的,我们的情况需要确保您的视图、Web视图等也遵循这样做。最后,我们终于让它工作了。
<style name="StyleWindowSoftInputModeAdjustResize" > <item name="android:windowSoftInputMode">adjustResize</item> <item name="android:windowFullscreen">false</item> </style>
然后在WebView中使用该样式WebView webview = new WebView(this, null, R.style.StyleWindowSoftInputModeAdjustResize);
但是当我点击WebView中加载的某个输入框时,软键盘没有弹出... 我的WebView位于HorizontalScrollView内,而HorizontalScrollView又位于vertical ScrollView内。 - GeorgewindowFullscreen="true"
或 android:theme="一些包含 windowFullScreen=true 的样式"
,例如 android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
,那么 windowSoftInputMode
将不起作用。 - Juan José Melero Gómezandroid:windowTranslucentStatus = true
)也会阻止adjustResize
的工作。 - geoffliu我已经疯了,什么都不起作用。android:windowSoftInputMode="adjustResize"
可能会有所帮助,但请确保您的应用程序没有全屏显示。
将我的应用程序退出全屏模式解决了键盘弹出时布局大小调整的问题。
<item name="android:windowFullscreen">false</item>
android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
,这个设置会阻止 adjustResize
的正常工作。只使用 android:theme="@android:style/Theme.NoTitleBar"
就可以使 adjustResize
正常工作。 - Gady对于全屏模式下的活动,android:windowSoftInputMode="adjustResize" 将无法工作。
https://developer.android.com/reference/android/view/WindowManager.LayoutParams.html#FLAG_FULLSCREEN
全屏窗口将忽略窗口的 softInputMode 字段中 SOFT_INPUT_ADJUST_RESIZE 的值;该窗口将保持全屏且不会调整大小。
我在活动中使用以下方法通过设置底部 padding 来调整布局:
public void adjustResizeOnGlobalLayout(@IdRes final int viewGroupId, final WebView webView) {
final View decorView = getWindow().getDecorView();
final ViewGroup viewGroup = (ViewGroup) findViewById(viewGroupId);
decorView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
Rect rect = new Rect();
decorView.getWindowVisibleDisplayFrame(rect);
int paddingBottom = displayMetrics.heightPixels - rect.bottom;
if (viewGroup.getPaddingBottom() != paddingBottom) {
// showing/hiding the soft keyboard
viewGroup.setPadding(viewGroup.getPaddingLeft(), viewGroup.getPaddingTop(), viewGroup.getPaddingRight(), paddingBottom);
} else {
// soft keyboard shown/hidden and padding changed
if (paddingBottom != 0) {
// soft keyboard shown, scroll active element into view in case it is blocked by the soft keyboard
webView.evaluateJavascript("if (document.activeElement) { document.activeElement.scrollIntoView({behavior: \"smooth\", block: \"center\", inline: \"nearest\"}); }", null);
}
}
}
});
}
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
该代码与调整窗口大小以适应软键盘相对应。在解决这个问题时,我学到了几件事情 --- 1. 主题样式不应包含Fullscreen True 2. 添加android:windowSoftInputMode="adjustResize" 3. 如果有的话,删除android:scrollbars="none"... 干杯!
Adding below to manifest, webview and fragment:
android:windowSoftInputMode="adjustResize"
Using NON FullScreen Theme such as below:
<style name="AppTheme" parent="android:Theme.Black.NoTitleBar">
<item name="android:windowNoTitle">true</item>
<item name="android:windowActionBar">false</item>
<item name="android:windowFullscreen">false</item>
</style>
android:windowSoftInputMode="adjustResize"
当您处于沉浸式模式时,不起作用
是的,我也遇到了同样的问题,在使用Webview时,我的问题出现在模态框上的输入字段上。文本字段没有在键盘上方“聚焦”。 解决方法是延迟函数调用。希望有人会发现这个有用。
$("body").on("click", ".jstree-search-input", function () {
setTimeout(function(){
androidScroll();
}, 500);
});
正如您所看到的,它用于jstree输入...
function androidScroll() {
// Webview focus call (pushes the modal over keyboard)
$('.control-sidebar-open ').scrollTop($('.control-sidebar-open ')[0].scrollHeight);
}