Как сделать что-то после того, как пользователь нажмет на мой EditText - PullRequest
50 голосов
/ 22 января 2010

У меня есть EditText, который показывает время. После того, как пользователь нажимает EditText, я хочу показать TimePickerDialog, поэтому я установил View.OnClickListener для моего EditText.

Но OnClickListener ведет себя странно - я касаюсь EditText, и затем появляется программная клавиатура (которую я не хочу). Когда я снова касаюсь, OnClickListener.onClick() наконец вызывается и появляется диалоговое окно.

Что мне делать, если я хочу, чтобы диалоговое окно появилось немедленно?

Ответы [ 6 ]

111 голосов
/ 18 февраля 2010

В отличие от большинства других элементов управления, EditText s можно фокусировать, пока система находится в «сенсорном режиме». Первое событие щелчка фокусирует элемент управления, а второе событие щелчка фактически запускает 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" />
44 голосов
/ 28 августа 2012

Другое решение заключается в использовании 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.

3 голосов
/ 22 января 2010

Звучит так, будто вы не хотите, чтобы пользователь мог набирать текст EditText. Вы просто хотите, чтобы они могли выбирать время через средство выбора времени. Так почему бы не просто кнопка, которая выскакивает TimePickerDialog? Вы можете отобразить время, выбранное в TextView.

Или вы можете просто заменить представление EditText на TimePicker представление (не диалог, а обычный просмотр).

2 голосов
/ 13 марта 2018

Вместо сенсорного прослушивателя используйте Text Change Listener:

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 голосов
/ 23 января 2010

Я решил эту проблему с помощью настраиваемой кнопки, например:

<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" />
1 голос
/ 22 января 2010

Если я правильно понимаю, вам просто нужно что-то вроде

<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" 

, который устарел, но делает свое дело.

...