web-dev-qa-db-ja.com

ユーザーが私のEditTextをクリックした後に何かをする方法

時間を示すEditTextがあります。ユーザーがEditTextをクリックした後、TimePickerDialogを表示したいので、EditTextに_View.OnClickListener_を設定します。

しかし、OnClickListenerの動作がおかしい-EditTextをタッチすると、ソフトウェアキーボードが表示されます(これは望ましくありません)。もう一度タッチすると、OnClickListener.onClick()が最後に呼び出され、ダイアログが表示されます。

ダイアログをすぐに表示するにはどうすればよいですか?

51
fhucho

他のほとんどのコントロールとは異なり、EditTextsは、システムが「タッチモード」のときにフォーカス可能です。最初のクリックイベントはコントロールにフォーカスし、2番目のクリックイベントは実際にOnClickListenerを発生させます。 Android:focusableInTouchModeビュー属性でタッチモードフォーカスを無効にすると、OnClickListenerが期待どおりに起動するはずです。

<EditText
        Android:text="@+id/EditText01"
        Android:id="@+id/EditText01"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:focusableInTouchMode="false" />
112
Kai

別の解決策は、ontouchlistenerを使用することです。

edittext.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if(MotionEvent.ACTION_UP == event.getAction()) {
            mQuaternion_1.setText("" + mQ1);
        }

        return true; // return is important...
    }
});

trueを返す場合、イベントが処理され、キーボードはポップアップしません。キーボードをポップアップして登録クリックさせたい場合は、falseを返します。

45
Warpzit

ユーザーが実際にEditTextを入力できるようにしたくないようです。時間ピッカーで時間を選択できるようにしたいだけです。では、なぜTimePickerDialogをポップアップするボタンだけではないのでしょうか?選択した時間をTextViewで表示できます。

または、EditTextビューを TimePicker ビュー(ダイアログではなく、通常のビュー)に置き換えることもできます。

3
Mark B

タッチリスナーの代わりに、テキスト変更リスナーを使用します。

editText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            //yourFunction();
        }

        @Override
        public void afterTextChanged(Editable s) {

        }
    });
2
Kumar VL

このようなカスタマイズされたボタンを使用してこれを解決しました:

<Button
        Android:id="@+id/btTime"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:gravity="center_vertical"
        Android:text="test"
        Android:textSize="20dp"
        Android:background="@Android:drawable/edit_text" />
2
fhucho

私が正しく理解していれば、次のようなものが必要です

<EditText Android:text="@+id/EditText01" Android:id="@+id/EditText01"
    Android:layout_width="wrap_content" Android:layout_height="wrap_content"
    Android:clickable="true" Android:inputType="none" />

編集およびクリックはできません。 OnClickListenerを設定すれば完了です。理論的には、実際にはあなたも追加する必要があります

Android:editable="false" 

これは非推奨ですが、トリックを行います。

1