DatePickerDialog软键盘类型无效

时间:2012-05-12 13:23:45

标签: android date

我正在我的应用程序中实现一个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 );

我做错了什么?

2 个答案:

答案 0 :(得分:1)

你看到的是(我认为)正常行为。 DatePickerDialog由一个DatePicker窗口小部件组成,该窗口小部件由每个日期部分(日,月,年)的三个NumberPicker窗口小部件组成。这些NumberPickerImageViewsEditText组成,作为输入区域。单击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上单击即可。)