因此,我遇到了一个似乎很常见的问题,即对话框中的 EditText 在获得焦点时不会显示出来。我已经看到了一些变通方法,比如在 这根线、 这个和 这个(以及更多)中,但是我从来没有看到一个令人满意的解释,说明 为什么正在发生这种情况。
我更希望 Android 使用自己的默认行为来编辑文本,而不是自己创建,但似乎每个人(在那些线程中)都已经接受了这样一个事实: 在对话框中编辑文本的默认行为是只提供一个光标而不提供键盘。为什么会这样?
郑重声明,这些变通方法似乎都不适合我——我能做到的最接近的事情是强制键盘在对话框中显示 下面(使用 InputMethodManager.toggleSoftKeyboard (*))。我的特殊配置是 API15,EditText 显示在 AlertDialog 中 ListView 的页脚中。设置了 EditText android: focus able = “ 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 的可见性设置为“ 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.
键盘出现,然后消失,可能是因为我切换了两次,但即使我确保它保持不变,它的 后面对话框窗口(在一个灰色区域) ,没有办法到达它不关闭对话框。
也就是说,我想强调的是,即使我可以得到这个解决方案的工作,我是 主要感兴趣在寻找一个简单的原因 为什么的编辑文本没有触发摆在首位,为什么这似乎是如此普遍!