我有一个AlertDialog
框,上面有大约10个控件(文本和TextView
)。这些控件位于ScrollView
AlertDialog
,加上我有2个正面和负面的按钮。我遇到的问题是当弹出软键盘时,两个按钮隐藏在键盘后面。
我在内部视图或对话框中寻找重绘功能。下面是我正在谈论的屏幕截图。
答案 0 :(得分:97)
如果您的对话框是使用其中一个Dialog主题的活动,则可以通过为活动的adjustResize
参数设置windowSoftInputMode
标记来实现此行为。
我正在使用:
android:windowSoftInputMode="adjustResize|stateHidden"
我认为您仍然可以在常规对话框中使用此标志,但我不确定如何应用它。您可能必须使用自定义主题创建AlertDialog,该主题继承正确的父主题并设置该标志,或者您可能必须使用ContextThemeWrappers和东西。
或许您可以使用Window#setSoftInputMode。
alertDialog.getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
答案 1 :(得分:15)
我找到了解决此问题的最佳方法。因为这是一个对话框,所以代码
alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
效果不佳。
除此代码外,您还必须为此对话框设置对话框样式。风格应如下所示:
<style name="DialogStyle" parent="@android:style/Theme.Black.NoTitleBar.Fullscreen">
<item name="android:windowFullscreen">false</item>
......
......
</style>
注意属性parent
是Theme.Black.NoTitleBar.Fullscreen
,就像活动的风格一样。属性android:windowFullScreen
应为false
。
现在,当软键盘切换时,对话框将调整大小。
答案 2 :(得分:2)
除adjustPan
根据文档
活动的主窗口未调整大小以便为软键盘腾出空间。相反,窗口的内容会自动平移,以便键盘不会遮挡当前焦点,用户可以随时看到他们正在键入的内容。这通常不如调整大小,因为用户可能需要关闭软键盘才能进入并与窗口的模糊部分进行交互。
所以只需在onCreate()或onCreateView()方法中使用它,如:
getDialog().getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);
或者只是将android:windowSoftInputMode="adjustPan"
放在我们正在玩对话框的Activiry的清单中
并在每个edittext中使用android:windowSoftInputMode="adjustResize|stateHidden"
,这将有助于用户轻松导航到下一个文本框。
指出要记住
永远不要使用 MATCH_PARENT 使对话框全屏,因为adjustPan
在此处不起作用。如果有人想让对话框适合屏幕,只需使用直到0.96(不超过这个)的点作为高度,因此键盘将正确到达edittext。我确实喜欢以下:
@Override
public void onStart()
{
super.onStart();
Dialog dialog = getDialog();
if (dialog != null)
{
//int height = ViewGroup.LayoutParams.MATCH_PARENT;
int width = ViewGroup.LayoutParams.MATCH_PARENT;
Display display = getActivity().getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
//int width = (int)(size.x * 0.96);
int h = (int)(size.y * 0.96);
dialog.getWindow().setLayout(width, h);
}
}
看,如果我将使用总高度(MATCH_PARENT),那么soft_keyboard会使对话框变得模糊。但是,如果我将使用高度点(这里0.96几乎接近match_parent),那么它将正常工作。
希望它会帮助某人:)
答案 3 :(得分:1)
也许您不需要调整Dialog
的大小将android:imeOptions =“actionNext”添加到EditText(除了最后一个)(它会将“Next”按钮添加到键盘 - 转到下一个EditText)
并将android:imeOptions =“actionDone”添加到最后的EditText(“完成”按钮 - 隐藏键盘)
现在用户应该可以点击按钮
如果您在代码中创建文本框,请使用EditText#setImeOptions函数
HTH
答案 4 :(得分:1)
您是否被迫将其作为弹出窗口?弹出窗口看起来很大,您可能只想将其作为单独的活动。通常,弹出窗口用于提供简短的问题或声明,其中包含一些选项,而不是完整的数据输入表单。由于你不能在大弹出窗口后面看到太多,所以你不会暴露任何底层控件。
答案 5 :(得分:0)
立即显示键盘并调整大小:
editText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
if (hasFocus) {
dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE | WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
}
}
});
答案 6 :(得分:0)
给和我一样情况的人。
在我的例子中,问题是在样式中具有这些属性的活动
<style name="SomeStyleName">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
如果 windowTranslucentStatus
和 windowTranslucentNavigation
都为真,
键盘在覆盖对话框时出现。
所以我将这些值覆盖为 false,仅用于 materialAlertDialog。 (在您的情况下可能是 AlertDialog 或 Dialog)
<style name="SomeStyleName">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<item name="materialAlertDialogTheme">@style/TranslucentMaterialAlertDialogTheme</item>
</style>
<style name="TranslucentMaterialAlertDialogTheme" parent="ThemeOverlay.MaterialComponents.MaterialAlertDialog">
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowTranslucentNavigation">false</item>
</style>