3

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

我究竟做错了什么?

4

2 回答 2

1

你看到的是(我认为)正常的行为。ADatePickerDialog由单个小部件组成,该小部件由每个日期部分(日、月、年)的DatePicker三个小部件组成。NumberPicker这些NumberPicker是由ImageViewsEditText作为输入区域组成的。单击EditText以显示键盘以输入数据/文本不会删除旧数据,因此行为是正常的。

您将很难覆盖此行为,特别是如果您计划覆盖较旧的 android 版本,因为您将无法访问 input EditTexts。例如,您无法DatePicker在较旧的 android 版本上访问对话框的小部件,访问此小部件的方法仅在最近才添加到DatePickerDialog(在HoneycombAPI 版本 11 中)。

当然,您可以选择重新创建DatePickerDialog来实现该行为,但我认为这不值得付出努力。

于 2012-09-08T14:35:44.857 回答
0

OnGlobalFocusChangeListener您可以尝试通过添加以下内容来执行“当输入框具有焦点时自动选择其中的所有文本” DatePickerDialog

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具有嵌入的 a 在内部实现的事实EditText)。

在模拟器上进行比较,我注意到即使在 Android 4.0 和 4.1 之间,其行为NumberPicker也已经不同(您需要双击才能在 4.0 上显示软键盘,而在 4.1 上单击一次就足够了)。

于 2012-09-12T20:37:15.657 回答