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不是首先触发的,为什么这个似乎是如此平常!




以下是一种方法:

    final Window dialogWindow = dialog.getWindow();
    dialogWindow.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM);
    dialogWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);



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



这是为我工作。 创建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;
}