Android EditText onClickListener

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

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

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

Есть идеи?

благодаря

Solutions Collecting From Web of "Android EditText onClickListener"

Авторское обновление: ответ ниже, хотя и принятый в то время (во времена Eclair), сегодня в значительной степени неактуальен. Стандарты UX резко изменились с тех пор, как они были написаны. Сохраняем полноту и потому, что вы не можете удалить принятый ответ.

Появление диалога при фокусировке EditText кажется нестандартным интерфейсом. Учтите, что нормальная функция EditText полностью обойдена, поскольку вы даже не сможете вносить изменения в дату, которую вы выбрали, потому что каждый раз, когда вы даете ей фокус, вы открываете этот диалог.

Поскольку вы используете его как TextView, почему бы просто не использовать фактический TextView вместе с кнопкой? Когда кнопка нажата, поднимите DatePicker и вызовите TextView.setText () с датой, отформатированной так, как вы хотите. Вы можете использовать onClickListener для кнопки, и он будет вести себя так, как вы ожидаете. Я считаю, что это сделает функцию более понятной для пользователей.

Клавиатура, кажется, появляется, когда 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() {...}); 

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

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

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

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

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

 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. TextEdit не используется для его основной цели. Если вы хотите, чтобы DatePicker снова всплывал, вам нужно ввести delete (1-й случай) или фокус (2-й случай).

луч

IMHO Я не согласен с заявлением RickNotFred:

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

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

Следующее прекрасно работает для меня.

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

Хорошая тема. Ну, я сделал это. В файле 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(); } }; 

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

Установить для редактирования значение 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); } } }; 

Как предположил Диллон Кернс, настройка фокуса на фальшивые работы прекрасна. Но если ваша цель – отменить клавиатуру при нажатии на EditText, вы можете использовать:

 mEditText.setInputType(0); 

Почему никто не упомянул setOnTouchListener ? С помощью setOnTouchListener легко и правильно, и просто верните true, если слушатель потребляет событие, иначе false.

Это работает для меня:

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

Работа по умолчанию в 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" />