Android:对话框中的EditText不会拉起软键盘
所以我已经看到了一个常见的问题,那就是当我的对话框中的EditText获取焦点时,它不会显示出来。 我已经看到了几个解决方法,比如在这个线程中,这个和这个(还有更多),但是我从来没有看到一个令人满意的解释,为什么这首先发生。
我更喜欢让android为EditTexts使用它自己的默认行为,而不是构建自己的行为,但似乎每个人(在那些线程中)已经接受了对话框中的EditTexts的默认行为只是给出游标而没有键盘。 为什么会这样?
为了记录,这些解决方法似乎都不适用于我 - 最近我已经能够强制键盘出现在对话框下方(使用InputMethodManager.toggleSoftKeyboard(*))。 我的特定配置是API15,EditText显示在AlertDialog中的ListView的页脚上。 EditText android:focusable =“true”已设置,并且onFocusChangeListener正在接收焦点事件。
编辑:
根据要求,这里是我正在使用的特定代码片段。 我不打扰整个布局,但在这个特定的应用程序中,EditText出现在响应按下对话框上的按钮(类似于操作视图)。 它包含在RelativeLayout中,默认情况下它的可见性已“消失”:
<RelativeLayout
android:id="@+id/relLay"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:visibility="gone"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp">
<ImageButton
android:id="@+id/cancelBut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:background="@color/transparent"
android:src="@drawable/cancelButton"
android:layout_margin="5dp"/>
<ImageButton
android:id="@+id/okBut"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/cancelBut"
android:background="@color/transparent"
android:src="@drawable/okButton"
android:layout_margin="5dp" />
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="text"
android:focusable="true"
android:layout_toLeftOf="@id/okBut"/>
</RelativeLayout>
构建它的代码将relativeLayout的可见性设置为“可见”(并隐藏其他UI元素)。 根据我对EditText的经验,这应该足以在EditText获得焦点时拉起键盘。 但是,由于某种原因,情况并非如此。 我可以设置以下onFocusChangeListener:
edit_text.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// For whatever reason we need to request a soft keyboard.
InputMethodManager imm = (InputMethodManager)dlg.getWindow().getContext().getSystemService(_Context.INPUT_METHOD_SERVICE);
if(hasFocus)
imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
Log.v("DialogProblem", "Focus requested, " + (hasFocus?"has focus.":"doesn't have focus."));
}
}
});
使用这种配置,当我第一次输入EditText时,onFocusChangedListener会触发,并生成一个总是如下所示的日志:
Focus requested, has focus.
Focus requested, doesn't have focus.
Focus requested, has focus.
键盘出现然后消失,可能是因为我切换了两次,但即使确保它保持不变,它仍位于对话框窗口的后面(在灰色区域),并且没有办法在不关闭对话框的情况下进入该窗口。
也就是说,我想强调的是,尽管我可能能够解决这个问题,但我主要想找到一个简单的理由,为什么EditText不是首先触发的,为什么会这样似乎很常见!
好吧,在阅读了很多内容之后,我已经弄清楚为什么这是一个问题,我不需要使用任何解决方法。
这个问题似乎是(至少在我的情况下),因为你输入文本的地方最初是隐藏的(或嵌套或某物),AlertDialog会自动设置标志WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM(或者它和WindowManager的某种组合.LayoutParams.FLAG_NOT_FOCUSABLE),使事物不会触发软输入来显示。
我发现解决这个问题的方法是在创建对话框后添加以下行:
dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
一旦完成,EditText的行为就像一个正常的EditText,没有必要的解决方法或解决方法。
我在自己的应用程序中遇到同样的问题。 如果您正在开发API级别> = 8,则可以使用以下代码片段:
dialog.setOnShowListener(new OnShowListener() {
@Override
public void onShow(DialogInterface dialog) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(textEdit, InputMethodManager.SHOW_IMPLICIT);
}
});
我还没有找到更低API级别的解决方案...
顺便说一句:这段代码并不总是在模拟器上工作。 我不知道为什么。
如果您阅读AlertDialog文档,您会发现:
AlertDialog类负责根据对话框中的任何视图是否从View.onCheckIsTextEditor()返回true来为您自动设置* WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM *。 一般而言,您希望将此设置设置为不含文本编辑器的对话框,以便将其放置在当前输入法UI的顶部。 调用onCreate之后,您可以通过将标志强制为所需的模式来修改此行为。
我遇到了你在Dialog中使用ListView中的EditText提到的问题。 我通过用自己的FocusableListView覆盖自定义视图类(在我的情况下是ListView)来修复它,只覆盖一个方法:
public class FocusableListView extends ListView {
public FocusableListView(Context context) {
super(context);
}
public FocusableListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FocusableListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
public boolean onCheckIsTextEditor() {
// this is where the magic happens
return true;
}
}
然后我在布局文件中使用它:
<?xml version="1.0" encoding="UTF-8"?>
<com.myexample.wiget.FocusableListView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:descendantFocusability="beforeDescendants"
android:layout_height="wrap_content" />
您可以用相同的方式覆盖您的案例中的RelativeLayout,它应该可以工作。
链接地址: http://www.djcxy.com/p/93345.html上一篇: Android: EditText in Dialog doesn't pull up soft keyboard