39

我有一个AlertDialog盒子,TextView上面有大约 10 个控件(文本和 )。这些控件在ScrollViewwith 中AlertDialog,加上我有 2 个正负两个按钮。我遇到的问题是当软键盘弹出时,两个按钮隐藏在键盘后面。

我在我的内部视图或对话框上寻找类似重绘功能的东西。下面是我正在谈论的屏幕截图。

在此处输入图像描述

4

7 回答 7

115

如果您的对话框是使用 Dialog 主题之一的活动,您可以通过设置活动参数的adjustResize标志来影响此行为。windowSoftInputMode

我正在使用:

android:windowSoftInputMode="adjustResize|stateHidden"

我认为您仍然可以将此标志与常规对话框一起使用,但我不确定如何应用它。您可能必须使用继承正确父主题并设置该标志的自定义主题创建 AlertDialog,或者您可能必须使用 ContextThemeWrappers 和其他东西。

或者,也许您可​​以只使用Window#setSoftInputMode

alertDialog.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
于 2011-09-15T17:47:42.607 回答
18

我找到了处理这个问题的最佳方法。因为这是一个对话框,所以代码

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.

现在,当软键盘切换时,对话框将调整大小。

于 2012-11-01T12:21:16.870 回答
4

没有什么对我有用,除了adjustPan

根据文档

Activity 的主窗口没有调整大小来为软键盘腾出空间。相反,窗口的内容会自动平移,因此当前焦点永远不会被键盘遮挡,用户始终可以看到他们正在输入的内容。这通常不如调整大小可取,因为用户可能需要关闭软键盘才能到达窗口的模糊部分并与之交互。

因此,只需在您的 onCreate() 或 onCreateView() 方法中使用它,例如:

getDialog().getWindow().setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN);

或者简单地android:windowSoftInputMode="adjustPan"为我们正在玩对话框的Activiry放入清单

android:windowSoftInputMode="adjustResize|stateHidden"在每个编辑文本中使用,这将帮助用户轻松导航到下一个文本框。

要记住的要点

切勿使用MATCH_PARENT使对话框全屏显示,因为adjustPan这里不起作用。如果有人想让对话框适应屏幕,只需使用点到 0.96(不超过这个)作为高度,这样键盘就会正确地到达编辑文本。我喜欢下面:

@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),那么它将正常工作。

希望它会帮助某人:)

于 2017-07-06T07:10:18.560 回答
2

也许你不需要调整 Dialog

将 android:imeOptions="actionNext" 添加到 EditText(除了最后一个)(它将在键盘上添加“下一步”按钮 - 转到下一个 EditText)

并将 android:imeOptions="actionDone" 添加到最后一个 EditText (“完成”按钮 - 隐藏键盘)

现在用户应该能够点击按钮

如果您在代码中创建文本框,请使用 EditText#setImeOptions 函数

高温高压

于 2011-04-11T14:11:39.690 回答
0

您是否被迫将其作为弹出窗口?弹出窗口看起来很大,您可能只想将它作为一个单独的活动。通常,弹出窗口用于提供带有几个选项的简短问题或陈述,而不是完整的数据输入表单。由于在大型弹出窗口后面看不到太多,因此无论如何您都不会暴露任何底层控件。

于 2011-04-11T14:57:54.400 回答
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);
        }
    }
});
于 2016-01-31T15:31:12.393 回答
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>
于 2021-04-15T13:25:36.753 回答