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

下一篇: Android Keyboard not showing