AndroidのEditTextonClickListener


85

が押されたときにDatePickerを作成するEditTextが必要です。だから私は次のコードを書きます:

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

    });

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


EditTextダイアログの代わりにスピナーを使用する必要があります。
ライアンR

回答:


129

EditTextがフォーカスを取得すると、キーボードがポップアップするように見えます。これを防ぐには、focusableをfalseに設定します。

<EditText
    ...
    android:focusable="false"
    ... />

この動作は、メーカーのAndroid OSフレーバーによって異なる場合がありますが、テストしたデバイスでは、これで十分であることがわかりました。それでもキーボードがポップアップする場合は、テキストの代わりにヒントを使用することも役立つようです。

myEditText.setText("My text");    // instead of this...
myEditText.setHint("My text");    // try this

これを実行すると、オンクリックリスナーが希望どおりに機能するはずです。

myEditText.setOnClickListener(new OnClickListener() {...});

これは機能しているように見えますが、フィールドに入力してキーボードの[次へ]をクリックすると、falseにフォーカスできる状態でフィールドがスキップされます。
スターリングディアス

59

通常、EditTextの通常の動作との最大の互換性が必要です。

したがって、使用しないでくださいandroid:focusable="false"。そうです、ビューはフォーカスできなくなり、見栄えが悪くなります。たとえば、背景のドローアブルは「押された」状態を表示しなくなります。

代わりにすべきことは次のとおりです。

myEditText.setInputType(InputType.TYPE_NULL);
myEditText.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // showMyDialog();
    }
});
myEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if (hasFocus) {
            // showMyDialog();
        }
    }
});

入力タイプをに設定TYPE_NULLすると、ソフトウェアキーボードがポップアップするのを防ぐことができます。

OnClickListenerおよびを設定することによりOnFocusChangeListener、ユーザーがクリックしたときにダイアログが常に開くようにします。EditTextフィールド、両方のそれは焦点(最初のクリック)とその後のクリックでを獲得したとき。

設定するだけ、android:inputType="none"またはsetInputType(InputType.TYPE_NULL)必ずしも十分ではありません。一部のデバイスandroid:editable="false"では、非推奨ですが、XMLでも設定する必要があります。それが機能しなくなった場合は、無視されます(サポートされていないすべてのXML属性として)。


これを行うと、編集テキストが再びフォーカスを取得するため、ダイアログが閉じた後にダイアログが再び開きます。これを回避する方法はありますか?
AdamMc331 2016年

@ McAdam331EditTextおそらく、そのコンポーネントはレイアウト内の唯一のウィジェットですか?android:focusable="true"親レイアウトに追加してみてください。
caw 2016年

1
@caw返信ありがとうございますが、onTouchを使用して動作させることになりました。ありがとう!
AdamMc331 2016年

それでおしまい。正常に動作しています。
XueQing

31

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

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

これが同様の問題を抱えている人に役立つことを願っています!


4
また、enabled = "false"を設定しないでください。これにより、onClickListenerが無効になります
OatsMantou

25

デフォルトの動作EditText:最初のクリックでフォーカスし、2回目のクリックで処理するonClickListenerため、フォーカスを無効にする必要があります。次に、最初にウィルonClickListenerハンドルをクリックします。

これを行うには、このandroid:focusableInTouchMode="false"属性をに追加する必要がありますEditText。それでおしまい!

このようなもの:

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="false"
        android:inputType="text" />

4
動作EditTextしますが、編集できなくなり、カーソルが表示されません。
CoolMind

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番目のケース)を入力する必要があります。

レイ


2
onFocusChangeListenerと一緒に行ったonClickListenerを追加しない限り。これは機能します:
neteinstein 2011

2番目の解決策は私のために働いた、ありがとう!:)
Celtik 2018年

9

EditTextでOnClickアクションを使用する場合:

java:

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

});

またはkotlin:

editTextChooseDate.setOnClickListener {
        showDialog(DATEINIT_DIALOG)
    }

したがって、次の行xmlを入力するとEditText、完全に機能します。

android:inputType = "none
"
android:focusable = "false" android:cursorVisible = "false"

例えば:

<EditText
            android:id="@+id/date_init" 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=""
            android:hint="Select Date"
            android:inputType="none"
            android:focusable="false"
            android:cursorVisible="false"/>

またはMaterialDesignの場合

<com.google.android.material.textfield.TextInputLayout
        android:id="@+id/layoutEditTextChooseDate"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent">

    <com.google.android.material.textfield.TextInputEditText
            android:id="@+id/date_init" 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text=""
            android:hint="Select Date"
            android:inputType="none"
            android:focusable="false"                      
            android:cursorVisible="false"/>

</com.google.android.material.textfield.TextInputLayout>

8

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

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

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


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();
    }
};

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()


簡単な修正:念のため、すべてのshowDialogの前にdismissDialogを実行してください。
Lukas Batteau 2012

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);
    }

});

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);
   }
 }
};

3
Android2.3.xを実行しているMotorola電話に注意してください。EditTextがスクロール可能な領域のどこかにある場合、モトローラはスクロールすると自動的にフォーカスを移動します。これは、下にスクロールして、EditTextにフォーカスが移ると、日付ダイアログがポップアップすることを意味します。これは驚くべきことであり、悪いことです。
エリックバーク

2

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

mEditText.setInputType(0);

2

なぜ誰も言及しなかったのsetOnTouchListenerですか?使用setOnTouchListenerは簡単で大丈夫です。リスナーがイベントを消費した場合はtrueを返し、それ以外の場合はfalseを返します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.