97

が押されたときに DatePicker を作成する EditText が必要です。そこで、次のコードを書きます。

    mEditInit = (EditText) findViewById(R.id.date_init);
    mEditInit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDialog(DATEINIT_DIALOG);
        }

    });

しかし、EditText を押すと、アクションは典型的なものになります。カーソルがテキストの入力を待っている代わりに、必要なダイアログが表示されます。

4

15 に答える 15

31

私はこれと同じ問題を抱えていました。コードは問題ありませんが、EditText のフォーカス可能な値を false に変更してください。

<EditText
android:id="@+id/date"
android:focusable="false"/>

これが同様の問題を抱えている人の助けになることを願っています!

于 2012-01-19T11:19:38.060 に答える
17

これが私が実装したソリューションです

mPickDate.setOnKeyListener(new View.OnKeyListener() {

    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        showDialog(DATE_DIALOG_ID);
        return false;
    }
});

また

mPickDate.setOnFocusChangeListener(new View.OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        showDialog(DATE_DIALOG_ID);

    }
});

違いを自分で見てください。問題は、(RickNotFredが言ったように)TextViewが日付を表示し、DatePickerを介して編集するためです。テキストエディットは、その主な目的には使用されません。DatePickerを再度ポップアップする場合は、delete(1番目のケース)またはde focus(2番目のケース)を入力する必要があります。

レイ

于 2010-11-22T10:30:24.530 に答える
8

私見 RickNotFred の声明には同意しません。

EditText がフォーカスを取得したときにダイアログをポップすることは、非標準のインターフェイスのように思えます。

ユーザーが EditText を押したときに日付を編集するためのダイアログを表示することは、キーボードまたはテンキー パッドを表示するデフォルトと非常によく似ています。日付が EditText と共に表示されるという事実は、日付が変更される可能性があることをユーザーに知らせます。日付を編集不可能な TextView として表示すると、日付が変更されない可能性があることがユーザーに通知されます。

于 2011-03-01T18:48:15.733 に答える
7

いい話題。さて、私はそうしました。XML ファイルの場合:

<EditText
    ...
    android:editable="false"
    android:inputType="none" />

Java コードでは:

txtDay.setOnClickListener(onOnClickEvent);
txtDay.setOnFocusChangeListener(onFocusChangeEvent);

private View.OnClickListener onOnClickEvent = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        dpDialog.show();
    }
};
private View.OnFocusChangeListener onFocusChangeEvent = new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus)
            dpDialog.show();
    }
};
于 2014-09-05T14:22:52.760 に答える
6

以下は私にとって完璧に機能します。

まず、日付ピッカーウィジェットの入力を「none」に設定して、ソフトキーボードがポップアップしないようにします。

<EditText android:inputType="none" ... ></EditText>

次に、これらのイベントリスナーを追加して、日付ピッカーを含むダイアログを表示します。

// Date picker
EditText dateEdit = (EditText) findViewById(R.id.date);
dateOfBirthEdit.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            showDialog(DIALOG_DATE_PICKER);
        }
        return false;
    }
});

dateEdit.setOnFocusChangeListener(new OnFocusChangeListener() {

    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            showDialog(DIALOG_DATE_PICKER);
        } else {
            dismissDialog(DIALOG_DATE_PICKER);
        }
    }
});

最後に一つだけ。入力した日、月、または年が日付ピッカーから正しくコピーされていることを確認するにはdatePicker.clearFocus()、たとえば、を介して値を取得する前に呼び出しますgetMonth()

于 2012-01-16T17:11:03.037 に答える
5

これは私のために働く:

mEditInit = (EditText) findViewById(R.id.date_init);
mEditInit.setKeyListener(null);
mEditInit.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        @Override
        public void onFocusChange(View v, boolean hasFocus) {
            if(hasFocus)
            {
                mEditInit.callOnClick();
            }
        }
    });
mEditInit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showDialog(DATEINIT_DIALOG);
    }

});
于 2016-10-03T22:47:10.990 に答える
3

これが私のために働いたものです

編集可能を false に設定

<EditText android:id="@+id/dob"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Date of Birth"
android:inputType="none"
android:editable="false"

/>

次に、OnFocusChange のイベント リスナーを追加します。

private  View.OnFocusChangeListener onFocusChangeDOB= new View.OnFocusChangeListener() {

@Override
 public void onFocusChange(View v, boolean hasFocus) {
   if (hasFocus){
     showDialog(DATE_DIALOG_ID);
   }
 }
};
于 2012-05-26T14:09:15.637 に答える
2

Dillon Kearnsが示唆したように、focusableをfalseに設定すると問題なく機能します。ただし、EditTextがクリックされたときにキーボードをキャンセルすることが目標である場合は、次を使用することをお勧めします。

mEditText.setInputType(0);
于 2011-07-22T00:07:12.200 に答える