Android EditText onClickListener - PullRequest
       50

Android EditText onClickListener

71 голосов
/ 02 марта 2010

Я хочу EditText, который создает DatePicker при нажатии. Поэтому я пишу следующий код:

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

    });

Но когда я нажимаю EditText, действие является типичным: курсор, ожидающий ввода текста, вместо этого показывает желаемое диалоговое окно.

Есть идеи?

Спасибо

Ответы [ 12 ]

118 голосов
/ 15 мая 2011

Клавиатура, кажется, всплывает, когда EditText получает фокус. Чтобы предотвратить это, установите для фокуса значение false:

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

Это поведение может отличаться в зависимости от версий ОС Android разных производителей, но на устройства, которые я тестировал, я считаю, что этого достаточно. Если клавиатура все еще появляется, использование подсказок вместо текста также может помочь:

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

После того, как вы это сделаете, ваш прослушиватель при нажатии должен работать как нужно:

myEditText.setOnClickListener(new OnClickListener() {...});
50 голосов
/ 08 сентября 2013

Обычно требуется максимальная совместимость с нормальным поведением 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, которые не поддерживаются).

31 голосов
/ 19 января 2012

У меня была такая же проблема. Код в порядке, но убедитесь, что вы изменили фокусируемое значение EditText на false.

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

Надеюсь, это поможет любому, у кого была похожая проблема!

19 голосов
/ 04 мая 2017

Рабочая по умолчанию EditText: При первом щелчке он фокусируется, а при втором щелчке - 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" />
15 голосов
/ 22 ноября 2010

Вот решение, которое я реализовал

mPickDate.setOnKeyListener(new View.OnKeyListener() {

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

OR

mPickDate.setOnFocusChangeListener(new View.OnFocusChangeListener() {

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

    }
});

Посмотри на различия сам. Проблема в том, что (как сказал RickNotFred) TextView для отображения даты и редактирования через DatePicker. TextEdit не используется по своему основному назначению. Если вы хотите, чтобы DatePicker снова всплывал, вам нужно ввести delete (1-й регистр) или de focus (2-й регистр).

Ray

8 голосов
/ 01 марта 2011

ИМХО, я не согласен с заявлением RickNotFred:

Вывод диалогового окна при получении EditText фокус кажется нестандартным интерфейс.

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

6 голосов
/ 16 января 2012

У меня отлично работает следующее.

Сначала установите для ввода виджета выбора даты значение «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().

5 голосов
/ 05 сентября 2014

Хорошая тема. Ну, я так и сделал. В файле 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();
    }
};
4 голосов
/ 04 октября 2016

Для меня это работает:

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 голосов
/ 26 мая 2012

Вот что у меня сработало

Установить для редактирования значение 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);
   }
 }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...