Android edittext drawable click listener

codebreaker / RightDrawableOnTouchListener.java

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

public abstract class RightDrawableOnTouchListener implements OnTouchListener <
Drawable drawable;
private int fuzz = 10 ;
/**
* @param keyword
*/
public RightDrawableOnTouchListener ( TextView view ) <
super ();
final Drawable [] drawables = view . getCompoundDrawables();
if (drawables != null && drawables . length == 4 )
this . drawable = drawables[ 2 ];
>
/*
* (non-Javadoc)
*
* @see android.view.View.OnTouchListener#onTouch(android.view.View, android.view.MotionEvent)
*/
@Override
public boolean onTouch ( final View v , final MotionEvent event ) <
if (event . getAction() == MotionEvent . ACTION_DOWN && drawable != null ) <
final int x = ( int ) event . getX();
final int y = ( int ) event . getY();
final Rect bounds = drawable . getBounds();
if (x >= (v . getRight() — bounds . width() — fuzz) && x (v . getRight() — v . getPaddingRight() + fuzz)
&& y >= (v . getPaddingTop() — fuzz) && y (v . getHeight() — v . getPaddingBottom()) + fuzz) <
return onDrawableTouch(event);
>
>
return false ;
>
public abstract boolean onDrawableTouch ( final MotionEvent event );
>

This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters

this . keyword = ( EditText ) findViewById( R . id . search);
this . keyword . setOnTouchListener( new RightDrawableOnTouchListener (keyword) <
@Override
public boolean onDrawableTouch ( final MotionEvent event ) <
return onClickSearch(keyword);
>
>);
private boolean onClickSearch( final View view) <
// do something
event . setAction( MotionEvent . ACTION_CANCEL );
return false ;
>

This comment has been minimized.

Copy link Quote reply

rcgroot commented Feb 24, 2014

This code confuses the coordinate system of the screen (getRight() usage) with those of the View getX() and getY().

Don’t use it without fixing the bugs in the code.

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

Basic Event Listeners

Event Listening in Android development is largely centered around the View object.

Any View (Button, TextView, etc) has many event listeners that can be attached using the setOnEvent pattern which involves passing a class that implements a particular event interface. The listeners available to any View include:

  • setOnClickListener — Callback when the view is clicked
  • setOnDragListener — Callback when the view is dragged
  • setOnFocusChangeListener — Callback when the view changes focus
  • setOnGenericMotionListener — Callback for arbitrary gestures
  • setOnHoverListener — Callback for hovering over the view
  • setOnKeyListener — Callback for pressing a hardware key when view has focus
  • setOnLongClickListener — Callback for pressing and holding a view
  • setOnTouchListener — Callback for touching down or up on a view

Using Java

In Java Code, attaching to any event works roughly the same way. Let’s take the OnClickListener as an example. First, you need a reference to the view and then you need to use the set method associated with that listener and pass in a class implementing a particular interface. For example:

Читайте также:  Что делает android sdk tools

Alternatively, it is sometimes useful to have your class implement the listener directly, in which case you would add the listener implementation to your class and pass a reference to your class to the set method. For Example:

This pattern works for any of the view-based event listeners.

Using XML

In addition onClick has a unique shortcut that allows the method to specified within the layout XML. So rather than attaching the event manually in the Java, the method can be attached in the view. For example:

Within the Activity that hosts this layout, the following method handles the click event:

In addition to the standard View listeners, AdapterView descendants have a few more key event listeners having to do with their items:

  • setOnItemClickListener — Callback when an item contained is clicked
  • setOnItemLongClickListener — Callback when an item contained is clicked and held
  • setOnItemSelectedListener — Callback when an item is selected

This works similarly to a standard listener, simply implementing the correct AdapterView.OnItemClickListener interface:

This works similarly for the setting up a «long click» where an item is pressed and held down using the OnItemLongClickListener:

Troubleshooting: Item Click Not Firing If the item is more complex and does not seem to be properly responding to clicks after setting up the handler, the views inside the item might be drawing the focus. Check out this stackoverflow post and add the property android:descendantFocusability=»blocksDescendants» to the root layout within the template for the item.

In addition to the listeners described above, there are a few other common listeners for input fields in particular.

  • addTextChangedListener — Fires each time the text in the field is being changed
  • setOnEditorActionListener — Fires when an «action» button on the soft keyboard is pressed

If you want to handle an event as the text in the view is being changed, you only need to look as far as the addTextChangedListener method on an EditText (or even TextView):

This is great for any time you want to have the UI update as the user enters text.

Another case is when you want an action to occur once the user has finished typing text with the Soft Keyboard. Keep in mind that this is especially useful when you can see the virtual keyboard which is disabled by default in the emulator but can be enabled as explained in this graphic.

First, we need to setup an «action» button for our text field. To setup an «action button» such as a Done button on the soft Keyboard, simply configure your EditText with the following properties:

In particular, singleLine and imeOptions are required for the Done button to display. Now, we can hook into a editor listener for when the done button is pressed with:

This is often great whenever a user needs to type text and then explicitly have an action performed when they are finished. There are many imeOptions for different situations.

Similarly to EditText, many common input views have listeners of their own including NumberPicker has setOnValueChangedListener and SeekBar has setOnSeekBarChangeListener which allow us to listen for changes:

Читайте также:  Ситилинк провод для андроид

Almost all input views have similar methods available.

Источник

Установка onClickListner для права Drawable EditText

В моем приложении у меня есть EditText с иконкой поиска справа. Я использовал приведенный ниже код.

Я хочу установить onClickListner для изображения значка поиска, присвоенного правильному выделенному EditText . Как это возможно?

ОТВЕТЫ

Ответ 1

Также создайте интерфейс с помощью

Тем не менее, если вам нужна помощь, прокомментируйте

Также установите drawableClickListener в представлении в файле активности.

Ответ 2

Простое решение, используйте методы, которые Android уже дал, вместо того, чтобы повторно изобретать wheeeeeeeeeel: -)

Ответ 3

Это уже ответили, но я попробовал другой способ сделать его более простым.

Идея заключается в том, чтобы поместить ImageButton справа от EditText и иметь отрицательный запас к ней, чтобы EditText втекал в ImageButton , создавая впечатление, что кнопка находится в EditText .

Кроме того, как показано выше, вы можете использовать paddingRight с подобной шириной в EditText , если вы не хотите, чтобы текст в нем отображался над ImageButton .

Я догадался размер маржи с помощью дизайнера макетов Android и он похож на все размеры экрана. Или вы можете рассчитать ширину ImageButton и программно установить маржу.

Ответ 4

У вас нет доступа к правильному изображению, насколько мне известно, если вы не переопределите событие onTouch . Я предлагаю использовать RelativeLayout с одним editText и одним imageView и установить OnClickListener над изображением, как показано ниже:

Ответ 5

Пожалуйста, используйте ниже трюк:

  • Создайте кнопку изображения с помощью значка и установите его цвет фона прозрачным.
  • Поместите кнопку изображения в EditText
  • Реализовать «onclic’k» прослушиватель кнопки для выполнения вашей функции.

Ответ 6

Я знаю, что это довольно старый, но я недавно должен был сделать что-то очень похожее, и придумал гораздо более простое решение.

Это сводится к следующим шагам:

  • Создайте XML-макет, который содержит EditText и Image
  • Подкласс FrameLayout и раздувание XML-макета
  • Добавить код для прослушивателя кликов и любое другое поведение, которое вы хотите. без необходимости беспокоиться о позициях щелчка или любого другого грязного кода.

Источник

Android EditText onClickListener

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

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

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

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

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

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

Читайте также:  Почему долго запускается андроид

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

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

Обычно требуется максимальная совместимость с нормальным поведением EditText .

Таким образом, вы не должны использовать android:focusable=»false» поскольку, да, представление просто не будет фокусироваться больше, что выглядит плохо. Например, выведенный фон не будет показывать свое «нажатое» состояние.

Вместо этого вы должны сделать следующее:

Установив тип ввода в TYPE_NULL , вы запретите всплывающую клавиатуру программного обеспечения.

Установив OnClickListener и OnFocusChangeListener , вы убедитесь, что ваш диалог всегда открывается, когда пользователь нажимает на поле EditText , как при получении фокуса (первый щелчок), так и при последующих кликах.

Просто установка android:inputType=»none» или setInputType(InputType.TYPE_NULL) не всегда достаточно. Для некоторых устройств вы также должны установить android:editable=»false» в XML, хотя он устарел. Если он больше не работает, он просто будет проигнорирован (поскольку все атрибуты XML не поддерживаются).

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

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

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

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

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

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

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

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

Сначала установите вход виджета для выбора даты в «none», чтобы предотвратить появление мягкой клавиатуры:

Затем добавьте эти прослушиватели событий, чтобы отобразить диалоговое окно, содержащее средство выбора даты:

Одна последняя вещь. Чтобы убедиться, что введенные дни, месяцы или годы правильно скопированы из списка выбора даты, вызовите datePicker.clearFocus() прежде чем извлекать значения, например, через getMonth() .

Хорошая тема. Ну, я сделал это. В файле XML:

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

Установить для редактирования значение false

Затем добавьте прослушиватель событий для OnFocusChange

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

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

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

Работа по умолчанию в EditText : при первом щелчке фокусируется, а при втором щелчке обрабатывает onClickListener поэтому вам нужно отключить фокус. Затем при первом нажатии onClickListener будет обрабатывать.

Для этого вам нужно добавить этот android:focusableInTouchMode=»false» в ваш EditText . Это оно!

Источник

Оцените статью