3

アプリに DatePickerDialog を実装していますが、「日」を変更しようとすると、キャレットが数字の前にあるときに、ソフト キーボードがポップアップして数字が表示されるという問題があります。数字をクリックしても、「日」ボックスに既にあるものは置き換えられません。[日] ボックスの数字の末尾に移動して削除し (ソフト キーボードのバックスペース)、数字を入力した場合にのみ機能します。

なぜこうなった?すでにあるものを上書きしないのはなぜですか?

このコードはダイアログを表示します:

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

あなたが見ているのは(私が思うに)通常の振る舞いです。Aは、日付の各部分 (日、月、年) の 3 つのウィジェットから構成されるDatePickerDialog単一のDatePickerウィジェットで構成されます。NumberPickerこれらは、入力領域としてとNumberPickerから構成されます。をクリックしてデータ/テキストを入力するキーボードを表示しても、古いデータは消去されないため、動作は正常です。ImageViewsEditTextEditText

特に古いバージョンの 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;
}

ただし、いくつかの仮定 (主に、コンポーネントがが埋め込まれた をDatePicker使用して内部的に実装されているという事実) に依存しているため、これはすべての Android バージョンで機能しない可能性があることに注意してください。NumberPickerEditText

エミュレーターで比較すると、Android 4.0 と 4.1 の間でも、既に の動作が異なることに気付きましたNumberPicker(4.0 ではソフト キーボードを表示するにはダブルタップする必要がありますが、4.1 では 1 回のタップで十分です)。

于 2012-09-12T20:37:15.657 に答える