Android:对话框中的EditText不会拉起软键盘



Answers

我在自己的应用程序中遇到同样的问题。 如果您正在开发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级别的解决方案...

顺便说一句:这段代码并不总是在模拟器上工作。 我不知道为什么。

Question

所以我已经看到了一个常见的问题,那就是当我的对话框中的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不是首先触发的,为什么会这样似乎很常见!




This worked for me ----
editText.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
//dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
//dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
//dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
InputMethodManager mgr = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
mgr.showSoftInput(v, InputMethodManager.SHOW_FORCED);
editText.setFocusable(true);
}
});



我想补充保罗的答案亚历山大的评论

我自己有一个在onCreateDialog()方法中创建的对话框,它似乎需要返回dialog.show(); ,因此无法将layoutparams添加到创建对话框的对话框中。 要解决这个问题,只需保持onCreateDialog()方法相同,然后添加一个onResume()方法,如下所示:

@Override
public void onResume() {
    super.onResume();
    Dialog dialog = getDialog();
    dialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
}

这应该做的伎俩,谢天谢地,它适用于我。 这个案子已经有一段时间了。




这对我来说很有用。 创建AlertDialog.Builder,设置标题positiveButton,negativeButton。 完成后:

    AlertDialog dialog = builder.create();
    dialog.getWindow().clearFlags( WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    dialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE);
    dialog.show();
    editText.requestFocus();

你不需要使用builder.show();




上面的代码非常有用。 但是你必须在“create”方法之后调用“show”方法(我不知道为什么,但只有在我的对话框中使用ListView中的EditText时才起作用)。 在方法onCreateDialog中:

@Override
protected Dialog onCreateDialog(int id) {
  switch (id) {
    case YOUR_DIALOG_ID: {
        //...
        AlertDialog a = new AlertDialog.Builder(this)./*
        ... set the properties here
        */
        .create();
        a.show(); //!!! this is very important to call the "show" method
        a.getWindow().clearFlags(
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
        return a;
    }
  //...
  }
  return null;
}



Links