因此,我遇到了一个常见问题,那就是对话框中的EditText在获得焦点时没有显示。我已经看到了几种变通方法,例如在该线程,这个和这个(以及更多)中,但是我从来没有见过令人满意的解释,为什么会首先发生这种情况。
我更希望让android使用自己的默认行为来编辑文本而不是构建自己的默认行为,但是似乎每个人(在那些线程中)都已经接受了Dialogs中的EditTexts的默认行为是仅提供光标而没有键盘。为什么会这样呢?
记录下来,这些变通办法似乎都不对我有用-我能够获得的最接近的结果是强制键盘出现在对话框下面(使用InputMethodManager.toggleSoftKeyboard(*))。我的特定配置是API15,EditText显示在AlertDialog中ListView的页脚中。设置了EditText android:focusable =“ true”,并且onFocusChangeListener正在接收焦点事件。
编辑:
根据要求,这是我正在使用的特定代码段。我不会打扰整个布局,但是在这个特定的应用程序中,EditText的出现是响应按下对话框上的按钮(类似于动作视图)。它包含在RelativeLayout中,默认情况下其可见性为“ gone”:
<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的可见性设置为“ Visible”(并隐藏其他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,以及为什么这似乎很平常!