我正在我的应用程序中实现一个DatePickerDialog,我的问题是,当我尝试更改“Day”时,软键盘弹出并显示数字,而插入符号在数字之前。当我点击数字时,它不会替换“日期”框中已有的数字。只有当我在日期框中找到数字的末尾并将其删除(软键盘中的退格键)然后输入数字时,它才有效。
为什么会这样?为什么不覆盖已有的东西?
此代码显示对话框:
protected Dialog onCreateDialog(int id)
{
Dialog ReturnDialog = null;
switch (id)
{
case DATE_DIALOG_ID:
ReturnDialog = new DatePickerDialog(this, mDateSetListener, Year, Month - 1, Day );
break;
}
return ReturnDialog;
}
然后我从onClickListener()
调用它showDialog( DATE_DIALOG_ID );
我做错了什么?
答案 0 :(得分:1)
你看到的是(我认为)正常行为。 DatePickerDialog
由一个DatePicker
窗口小部件组成,该窗口小部件由每个日期部分(日,月,年)的三个NumberPicker
窗口小部件组成。这些NumberPicker
由ImageViews
和EditText
组成,作为输入区域。单击EditText
以显示键盘以输入数据/文本不会删除旧数据,因此行为正常。
您将很难覆盖此行为,尤其是如果您计划覆盖较旧的Android版本,因为您将无法访问输入EditTexts
。例如,您无法访问较旧的Android版本上的对话框的DatePicker
窗口小部件,访问此窗口小部件的方法最近才添加到DatePickerDialog
(在Honeycomb
,API版本中11)。
当然,您可以选择重新创建DatePickerDialog
来实现该行为,但我认为这不值得付出努力。
答案 1 :(得分:0)
您可以尝试通过向DatePickerDialog
添加OnGlobalFocusChangeListener
来“自动选择输入框具有焦点时的所有内容”,如下所示:
private final OnGlobalFocusChangeListener mFocusCheck = new OnGlobalFocusChangeListener() {
@Override
public void onGlobalFocusChanged(View oldFocus, View newFocus) {
if (newFocus != null && newFocus instanceof EditText) {
final EditText editText = (EditText) newFocus;
editText.selectAll();
}
}
};
@Override
protected Dialog onCreateDialog(int id) {
Dialog dialog = null;
switch (id) {
case DIALOG_ID:
dialog = new DatePickerDialog(this, mDateSetListener, year, month - 1, day) {
@Override
public void setView(View view) {
super.setView(view);
view.getViewTreeObserver().addOnGlobalFocusChangeListener(mFocusCheck);
}
};
break;
}
return dialog;
}
但请注意,这可能不适用于所有Android版本,因为我们依赖于某些假设(主要是DatePicker
组件在内部使用嵌入了NumberPicker
的{{1}}实现的事实EditText
)。
在模拟器上进行比较时,我注意到即使在Android 4.0和4.1之间,NumberPicker
的行为已经不同了(你需要双击才能让软键盘显示在4.0上,而在4.1上单击即可。)