Я добавил изображение справа от текста в EditText
виджет, используя следующий XML:
<EditText
android:id="@+id/txtsearch"
...
android:layout_gravity="center_vertical"
android:background="@layout/shape"
android:hint="Enter place,city,state"
android:drawableRight="@drawable/cross" />
Но я хочу, чтобы очистить при EditText
нажатии на встроенное изображение. Как я могу это сделать?
Ответы:
На самом деле вам не нужно расширять любой класс. Допустим, у меня есть EditText editComment с drawableRight
мы,
getRawX()
потому что мы хотим получить фактическое положение касания на экране, а не по отношению к родителю.Чтобы получить левую сторону нажмите
источник
event.getRawX()
вместоevent.getX()
@AngeloSgetRight()
право справа от TextView, которое не будет справа от рисованного, если есть отступы. Добавление- editComment.getPaddingRight()
в конец вашегоif
заявления должно работать.Очень, очень хорошо, спасибо всем, кто внес вклад в это обсуждение. Так что если вы не хотите иметь дело с неудобствами расширения класса, вы можете сделать следующее (реализовано только для правого рисования)
А вот реализация голого слушателя, основанная на ответе @ Mark
источник
v.getRight()
наv.getWidth()
.fuzz
эффективно делает область сглаживания немного больше, что облегчает касание маленького рисунка.Учтите следующее. Это не самое элегантное решение, но оно работает, я только что проверил.
Создайте индивидуальный
EditText
классCustomEditText.java
:Измените свой макет XML на этот (где
com.example
находится ваше фактическое имя пакета проекта):Наконец, добавьте это (или что-то похожее) к своей деятельности:
Я мог бы быть немного не в порядке с расчетом границ касания для вложенного рисованного объекта, но вы поняли идею.
Надеюсь, это поможет.
источник
TextView
вместоEditText
. Я взял код, и если я нажимаю наTextView
(не на иконку, а на любое место наTextView
),onTouchEvent(MotionEvent event)
вызывается метод . Таким образом, я могу реализоватьOnClickListener
для обычногоTextView
без каких-либо дополнительных классов, таких какCustomEditText
this.getRight()-rBounds.width()
почему бы не использоватьthis.getMeasuredWidth() - this.getCompoundPaddingRight()
? Разве это не позаботится о набивке рисования, а также избавится от границ рисования?EditText
не поддерживают правильную тонировку виджетов при использовании appcompat на устройствах перед леденцом на палочке. ИспользуйтеAppCompatEditText
в качестве родительского класса вашего пользовательского EditTextЯ создал полезный абстрактный класс DrawableClickListener, который реализует OnTouchListener .
В дополнение к классу DrawableClickListener я также создал 4 дополнительных абстрактных класса, которые расширяют класс DrawableClickListener и обрабатывают щелчок области рисования для правильного квадранта.
Укажите, чтобы рассмотреть
Одна вещь, чтобы рассмотреть, состоит в том, что изображения не изменяются, если сделано таким образом; таким образом, изображения должны быть правильно отмасштабированы перед тем, как помещены в папки res / drawable .
Если вы определите LinearLayout, содержащий ImageView и TextView , намного проще управлять размером отображаемого изображения.
activity_my.xml
MyActivity.java
DrawableClickListener.java
источник
Это очень просто. Допустим, в левой части вашего EditText 'txtsearch' есть отрисовка. Следующий сделает свое дело.
Если вы хотите для правого рисования, измените оператор if на:
Точно так же вы можете сделать это для всех составных чертежей.
Этот вызов метода возвращает все отступы на этой стороне, включая любые drawables. Вы можете использовать это даже для TextView, кнопки и т. Д.
Нажмите здесь для ссылки с сайта разработчика Android.
источник
Я думаю, что намного проще, если мы используем некоторые уловки :)
Готово
источник
RelativeLayout
для достижения правильного позиционирования, просто кажется менее запутанным, чем другие решения, и гораздо меньше кода для поддержки.Использование этого последнего вклада
contains(x,y)
не сработает напрямую с результатомgetBounds()
(за исключением случая, когда используются «левые» элементы рисования).getBounds
Метод обеспечивает толькоRect
задающие точки вытяжки элемента нормированного с началом в 0,0 - таким образом, вы на самом деле нужны сделать математику исходного сообщения , чтобы узнать , есть ли щелчок в области Drawable в контексте содержащий размеры EditText, но измените его на top, right, left и т. д. В качестве альтернативы вы можете описать aRect
, у которого есть координаты, фактически относящиеся к его положению вEditText
контейнере, и использовать егоcontains()
, хотя в конце вы выполняете ту же математику.Комбинируя их, вы получаете довольно полное решение, я только добавил атрибут экземпляра,
consumesEvent
который позволяет пользователю API решать, нужно ли передавать событие click или нет, используя его результат для установкиACTION_CANCEL
или нет.Кроме того, я не могу понять, почему значения
bounds
иactionX
,actionY
являются атрибутами экземпляра, а не просто локальными в стеке.Вот вырезка из реализации, основанной на вышеупомянутом, которую я собрал. Исправлена ошибка, из-за которой для правильного использования события необходимо возвращать false. Это добавляет «нечеткий» фактор к. В моем случае использования значка «Голосовое управление» в
EditText
поле мне было трудно щелкать мышью, поэтому размытие увеличивает эффективные границы, которые считаются щелчками при рисовании. У меня15
хорошо сработало. Мне нужно было только,drawableRight
чтобы я не включил математику в другие, чтобы сэкономить место, но вы видите идею.источник
Продолжая идею RyanM, я создал более гибкую версию, которая поддерживает все типы рисования (сверху, снизу, слева, справа). Хотя приведенный ниже код расширяет TextView, адаптация его для EditText - это всего лишь случай замены «extends TextView» на «extends EditText». Реализация виджета из XML такая же, как в примере с RyanM, за исключением имени виджета.
DrawableClickListener так же просто, как это:
А затем фактическая реализация:
ps: если вы не установите прослушиватель, прикосновение к TextView вызовет исключение NullPointerException. Вы можете добавить еще немного паранойи в код.
источник
Kotlin - отличный язык, где каждый класс может быть расширен новыми методами. Давайте введем новый метод для класса EditText, который будет отлавливать щелчки справа от окна.
Вы можете видеть, что она принимает функцию обратного вызова в качестве аргумента, которая вызывается, когда пользователь нажимает правую часть окна.
источник
это работает для меня,
источник
Я знаю, что это довольно старо, но недавно мне пришлось сделать что-то подобное ... Увидев, как это сложно, я нашел гораздо более простое решение:
В моем случае мне был нужен EditText, который имел возможность очистить текст кнопкой. Я хотел, чтобы он выглядел как SearchView, но по ряду причин я не хотел использовать этот класс. Пример ниже показывает, как я это сделал. Несмотря на то, что это не связано с изменением фокуса, принципы те же, и я подумал, что было бы выгоднее опубликовать реальный рабочий код, чем собрать пример, который может работать не так, как я планировал:
Вот мой макет: clearable_edit_text.xml
И вот класс, который раздувает этот макет: ClearableEditText.java
Чтобы этот ответ более соответствовал данному вопросу, необходимо предпринять следующие шаги:
источник
и если рисование слева, это поможет вам. (для тех, кто работает с версткой RTL)
источник
Просто скопируйте, вставьте следующий код, и он сделает свое дело.
источник
Ни одно из предыдущих решений не работало у меня в Xamarin Android . Мне удалось настроить правильный приемник для рисования кликов, используя следующее:
Создайте следующий
OnEditTextTouch
прослушиватель событий:Подписаться на событие Touch:
источник
Это все здорово, но почему бы не сделать это по-настоящему простым?
Я столкнулся с этим также не так давно ... и Android TouchListiner прекрасно работает, но дает ограничения в использовании .. и я пришел к другому решению, и я надеюсь, что это поможет вам:
Теперь вы можете создать прослушиватель ImageClick или событие и делать с текстом все, что вам нужно. Этот файл edittext_round_corners.xml
источник
EditText
должен бытьandroid:background="@android:color/transparent"
.Лучше иметь ImageButton справа от редактируемого текста и давать отрицательный запас макета, чтобы перекрываться с редактируемым текстом. Установите слушателя на ImageButton и выполните операции.
источник
источник
источник
для слушателя щелчка левой кнопкой мыши
источник
Сложные рисунки не должны быть кликабельными. Лучше использовать отдельные представления в горизонтальной линейной компоновке и использовать обработчик щелчков для них.
источник
Для тех, кто не хочет реализовывать чудовищную обработку кликов. Вы можете достичь того же с
RelativeLayout
. При этом вы даже можете свободно управлять позицией выдвижного ящика.ImageView
Позиция будет такой же , как вы будете использоватьdrawableEnd
- плюс вам не нужно все обработки сенсорного слушателя. Просто слушатель щелчка дляImageView
и вы готовы.источник
Это работает для меня :) может это поможет и вам
источник
Я видел несколько решений, но ни одно из них меня не убедило. Либо очень сложный, либо слишком простой (одноразовый).
Это мой любимый подход на данный момент:
И это многоразовый сенсорный слушатель:
Вы можете посмотреть на Gist здесь.
источник
Следуйте приведенному ниже коду для рисования справа, слева, вверх, вниз, нажмите:
}
источник
Я реализовал в Котлине
источник
Вот мое простое решение, просто поместите
ImageButton
поверхEditText
:источник
Я хотел бы предложить способ для рисования слева! Я попробовал этот код и работает.
источник
Я реализовал ответ @aristo_sh в Mono.Droid (Xamarin), так как это делегированный анонимный метод, вы не можете вернуть true или false, вы должны взять e.Event.Handled. Я тоже прячу клавиатуру на клике
источник
Я поделился своим обобщенным решением для обработки составных прорисовываемых событий нажатия и касания в TextView.
Сначала нам нужен обработчик сенсорного события:
Теперь вы можете обрабатывать любые сенсорные события на любом составном объекте рисования любого TextView следующим образом:
Интересуют только клики? Просто отфильтруйте по действию MotionEvent:
Опять же, мы можем легко обрабатывать клики на любой составной части любого TextView:
Надеюсь, тебе понравилось, как и мне. Я постараюсь держать его обновленным здесь и в соответствующей теме, если что-то изменится.
источник
Я создал простой пользовательский класс приемника касания вместо пользовательского EditText
}
Когда поле EditText будет пустым, рисования не будет. Drawable покажет, когда мы начали редактирование для очистки EditText.
Вы можете просто установить сенсорный слушатель
mEditText.setOnTouchListener (новый MyTouchListener (mEditText));
источник