Как что-то сделать после того, как пользователь нажмет на мой EditText

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

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

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


person fhucho    schedule 22.01.2010    source источник


Ответы (6)


В отличие от большинства других элементов управления, EditText можно сфокусировать, когда система находится в «сенсорном режиме». Первое событие щелчка фокусирует элемент управления, а второе событие щелчка фактически запускает OnClickListener. Если вы отключите фокус сенсорного режима с помощью атрибута android:focusableInTouchMode View, OnClickListener должен срабатывать, как и ожидалось.

<EditText
        android:text="@+id/EditText01"
        android:id="@+id/EditText01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusableInTouchMode="false" />
person Kai    schedule 17.02.2010
comment
есть также android:focusable, который работает как в сенсорном, так и в несенсорном режиме. - person Keith; 22.05.2012
comment
важно здесь, если вы хотите сделать какое-то дополнительное действие, например показать клавиатуру, если вы добавите это, клавиатура больше не сможет печатать :( - person cV2; 15.01.2015
comment
Спасибо ваш ответ был полезен - person Saraschandraa; 25.08.2015

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

person Warpzit    schedule 28.08.2012
comment
Я бы выбрал это как правильный ответ на общий вопрос Как что-то сделать после того, как пользователь нажмет на мой EditText. Нет изменений в xml, и состояние клавиатуры легко управляется. Другие ответы превращают EditText в кнопку. - person ElYeante; 14.09.2013
comment
Спасибо! Мне нужно было это, чтобы поставить selectAll() на мой EditText, поэтому я все еще хотел, чтобы клавиатура была поднята. Вернул false, и это сработало. - person Azurespot; 16.05.2016

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

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

person Mark B    schedule 22.01.2010
comment
Я хочу использовать EditText только потому, что в моем приложении он выглядит намного лучше, чем кнопка. Я знаю, что мог бы добиться того же эффекта, используя кнопку с соответствующими чертежами, но просто использовать edittext проще (мне не нужно создавать чертежи и т. д.) - person fhucho; 22.01.2010
comment
Просто примечание ... вам не нужно было бы создавать какие-либо чертежи, просто скажите кнопке использовать чертежи EditText. - person Jeremy Logan; 22.01.2010
comment
В этом случае попробуйте android:editable=false в представлении EditText. Вы по-прежнему должны иметь возможность захватывать события onClick, но, поскольку это не редактируется, программная клавиатура не должна появляться. - person Mark B; 22.01.2010
comment
В конце концов, использование кнопки с пользовательским рисунком и несколькими атрибутами xml было очень простым, спасибо за помощь. - person fhucho; 23.01.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" />
person fhucho    schedule 22.01.2010

Вместо Touch Listener используйте 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) {

        }
    });
person Kumar VL    schedule 13.03.2018

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

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

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

person Diego Torres Milano    schedule 22.01.2010
comment
Работал на меня. В чем проблема ? - person Diego Torres Milano; 23.01.2010
comment
С вашим кодом клавиатура не открывается, но она по-прежнему вызывает мой onClick() при втором щелчке, а не при первом. Я протестировал его на Android 2.0.1, и у моего приложения есть minSdk 3. - person fhucho; 24.01.2010
comment
я испытываю то же поведение, что и @fhucho, упомянутое выше. вот свойства, которые я установил для своего объекта EditText: <EditText android:clickable="true" android:editable="false" android:inputType="none" <!-- disables the keyboard from automatically showing up when one taps inside of the EditText --> android:textSize="18sp" /> можно ли как-то инициировать событие при первом нажатии? а не второй тап? похож на - (void)textFieldDidBeginEditing:(UITextField *)textField делегат iOS? заранее спасибо! Коул - person Cole; 24.03.2011