2011-04-11 34 views
28

好吧我有一个AlertDialog框,其上有大约10个控件(文本和文本视图)。这些控件在alertdialog的scrollview中,加上我有2个按钮正面和负面。我遇到的问题是弹出软键盘时,两个按钮隐藏在键盘后面。如何在键盘显示屏上调整AlertDialog的大小

我正在寻找像我的内部视图或对话框重绘功能的东西。

如果任何人有任何想法请帮助。以下是我正在谈论的屏幕截图。

enter image description here

回答

90

如果您的对话框是使用某个对话框主题的活动,则可以通过为该活动的windowSoftInputMode参数设置adjustResize标志来实现此行为。

我使用:

android:windowSoftInputMode="adjustResize|stateHidden" 

我觉得你还是可以使用这个标志与常规的对话,但我不知道如何使用它。您可能必须使用继承正确父主题的自定义主题创建AlertDialog,并设置该标志,否则您可能必须使用ContextThemeWrappers和其他东西。

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

alertDialog.getWindow().setSoftInputMode(
    WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); 
+9

最后一行适用于我,理想情况下,我想这是这里的问题,这是正确的答案。所选答案更多的是设计更改建议,而不是正确的答案。 +1的答案 – 2012-01-03 16:43:25

+0

嗨核磁共振,最后一行也为我工作!谢谢。 – Luke47 2012-01-30 08:58:12

+4

如果你有一个自定义样式,你也可以使它成为样式定义的一个元素。' – ChristophK 2012-08-17 13:37:16

2

也许你并不需要调整对话框

添加机器人:imeOptions =“actionNext”来的EditText(所有,但最后一个)(这将增加“下一步”按钮,键盘 - 去到明年的EditText)

,然后加入Android:imeOptions = “actionDone” 去年的EditText( “完成” 按钮 - 隐藏键盘)

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

,如果你在代码中创建使用的EditText#setImeOptions功能的文本框

HTH

+1

感谢您的信息,但这不是如何用户会在这种情况下表现。那就是他们有自由只填充一个或多个文本框并非全部 – Sanj 2011-04-11 14:29:15

+0

我想你有一个有效的观点。 – Sanj 2011-04-13 20:33:24

1

你不得不把它作为一个弹出?弹出窗口非常大,您可能只想将其作为单独的活动。一般来说,弹出窗口用于提供一个简短的问题或语句,但有一些选项,而不是完整的数据输入表单。由于您无法在大型弹出窗口后看到多少东西,因此您无论如何都不会暴露任何底层控件。

+2

虽然你的回答听起来对我来说,它并没有解决边缘情况。如何在平板电脑上使用中型Dialog? – nmr 2011-09-01 16:47:27

+0

的确,我正在考虑掌上电脑,给出了截图。如果你正在为平板电脑开发一个独立的用户界面,我想中型平板电脑的对话框可能会起作用,但我认为一般来说,一个对话框应该用于非常小的数据输入和通知。如果你想制作一些形式的东西,那就把它当做一个单独的活动吧。 – 2011-09-06 14:28:56

+4

但这并没有回答这个问题。 – ViliusK 2013-06-06 08:15:20

10

我找到了解决这个问题的最佳方法。因为这是一个对话框,所以代码“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> 

注意,属性“”是“Theme.Black.NoTitleBar.Fullscreen”就像一个活动的样式。并且属性“android:windowFullScreen”应该是false。

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

+0

这工作完美,谢谢。 – 2014-02-26 15:38:39

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); 
     } 
    } 
}); 
2

没有什么工作对我来说,除了adjustPan

不能调整大小活动的主窗口,以腾出空间文档软键盘。相反,窗口的内容会自动平移,以便当前焦点永远不会被键盘遮挡,用户始终可以看到他们正在键入的内容。这通常不如调整大小,因为用户可能需要关闭软键盘才能与窗口的遮蔽部分进行交互。

所以只是简单地使用它在你的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的squize对话框。但是,如果我将使用点数作为高度(此处0.96几乎接近match_parent),那么它将正常工作。

希望它可以帮助别人:)

相关问题