He agregado una imagen a la derecha del texto en un EditText
widget, usando el siguiente 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" />
Pero quiero borrar el EditText
cuando se hace clic en la imagen incrustada. ¿Cómo puedo hacer esto?
Respuestas:
En realidad no necesitas extender ninguna clase. Digamos que tengo un EditText editComment con un drawableRight
estamos
getRawX()
porque queremos obtener la posición real del toque en la pantalla, no en relación con los padres.Para obtener el lado izquierdo, haga clic
fuente
event.getRawX()
lugar deevent.getX()
@AngeloSgetRight()
obtener el derecho de TextView, que no será el derecho del dibujo si hay relleno. Agregar- editComment.getPaddingRight()
al final de suif
declaración debería funcionar.Muy, muy bien, gracias a todos los que contribuyeron a esta discusión. Entonces, si no desea lidiar con los inconvenientes de extender la clase, puede hacer lo siguiente (implementado solo para el sorteo correcto)
Y aquí está la implementación básica del oyente basada en la respuesta de @ Mark
fuente
v.getRight()
porv.getWidth()
.fuzz
efectivamente hace que el área tappable sea un poco más grande, lo que facilita tocar el pequeño dibujo.Considera lo siguiente. No es la solución más elegante, pero funciona, lo acabo de probar.
Crea una
EditText
clase personalizadaCustomEditText.java
:Cambie su diseño XML a esto (donde
com.example
está el nombre real del paquete de su proyecto):Finalmente, agregue esto (o algo similar) a su actividad:
Podría estar un poco equivocado con el cálculo de los límites táctiles para el dibujo anidado, pero se entiende la idea.
Espero que esto ayude.
fuente
TextView
lugar deEditText
. Tomé el código y si hago clic enTextView
(no en el icono sino en cualquier espacio en elTextView
),onTouchEvent(MotionEvent event)
se llama al método . Por lo tanto, puedo implementarOnClickListener
para un habitualTextView
sin clases adicionales comoCustomEditText
this.getRight()-rBounds.width()
¿ por qué no usarthis.getMeasuredWidth() - this.getCompoundPaddingRight()
? ¿No se ocuparía del acolchado del drawable y también eliminaría el límite del drawable?EditText
no admiten el tinte de widgets adecuado cuando se usa appcompat en dispositivos pre-lollipop. ÚseloAppCompatEditText
como clase principal de su EditText personalizadoCreé una útil clase abstracta DrawableClickListener que implementa OnTouchListener .
Además de la clase DrawableClickListener , también creé 4 clases abstractas adicionales que extienden la clase DrawableClickListener y manejan el clic del área dibujable para el cuadrante correcto.
Punto a considerar
Una cosa a considerar es que las imágenes no cambian de tamaño si se hacen de esta manera; por lo tanto, las imágenes se deben escalar correctamente antes de colocarlas en res / drawable carpetas .
Si define un LinearLayout que contiene un ImageView y un TextView , es mucho más fácil manipular el tamaño de la imagen que se muestra.
activity_my.xml
MyActivity.java
DrawableClickListener.java
fuente
Es muy simple. Digamos que tiene un dibujo en el lado izquierdo de su 'txtsearch' de EditText. Siguiente hará el truco.
Si desea dibujar correctamente, cambie la instrucción if a:
Del mismo modo, puede hacerlo para todos los sorteos compuestos.
Esta llamada al método devuelve todo el relleno de ese lado, incluidos los elementos extraíbles. Puede usar esto incluso para TextView, Button, etc.
Haga clic aquí para referencia del sitio de desarrolladores de Android.
fuente
Creo que es mucho más fácil si usamos algunos trucos :)
Hecho
fuente
RelativeLayout
para lograr un posicionamiento adecuado, parece menos complicado que otras soluciones y mucho menos código para mantener.El uso de esa última contribución
contains(x,y)
no funcionará directamente en el resultado degetBounds()
(excepto, por coincidencia, cuando se usan elementos dibujables "izquierdos"). ElgetBounds
método solo proporciona losRect
puntos de definición del elemento dibujable normalizado con origen en 0,0, por lo que, en realidad, debe hacer los cálculos de la publicación original para averiguar si el clic está en el área del dibujable en el contexto de que contiene las dimensiones de EditText, pero cámbielas por arriba, derecha, izquierda, etc. Alternativamente, puede describir unaRect
que tenga coordenadas realmente relativas a su posición en elEditText
contenedor y usarlacontains()
, aunque al final está haciendo los mismos cálculos.La combinación de ambos le brinda una solución bastante completa, solo agregué un atributo de instancia
consumesEvent
que permite al usuario de la API decidir si el evento de clic debe pasarse o no mediante el uso de su resultado para establecerloACTION_CANCEL
o no.Además, no puedo ver por qué los valores
bounds
yactionX
,actionY
son atributos de instancia en lugar de solo locales en la pila.Aquí hay un recorte de una implementación basada en lo anterior que armé. Soluciona un problema que, para consumir correctamente el evento, debe devolver falso. Agrega un factor de "fuzz" a. En mi caso de uso de un ícono de control de voz en un
EditText
campo, me resulta difícil hacer clic, por lo que la pelusa aumenta los límites efectivos que se consideran hacer clic en el dibujo. Para mí15
funcionó bien. Solo lo necesitabadrawableRight
para no enchufar las matemáticas en los demás, para ahorrar algo de espacio, pero ya ves la idea.fuente
Ampliando la idea de RyanM, he creado una versión más flexible, que admite todos los tipos dibujables (arriba, abajo, izquierda, derecha). Mientras que el siguiente código extiende TextView, adaptarlo para EditText es solo un caso de intercambio "extiende TextView" con "extiende EditText". La creación de instancias del widget desde XML es idéntica a la del ejemplo de RyanM, salvo el nombre del widget.
DrawableClickListener es tan simple como esto:
Y luego la implementación real:
ps: si no configura el oyente, tocar TextView provocará una NullPointerException. Es posible que desee agregar más paranoia en el código.
fuente
Kotlin es un gran lenguaje donde cada clase podría ampliarse con nuevos métodos. Vamos a introducir un nuevo método para la clase EditText que capturará los clics para dibujar a la derecha.
Puede ver que toma la función de devolución de llamada como argumento que se llama cuando el usuario hace clic para dibujar a la derecha.
fuente
está funcionando para mí
fuente
Sé que esto es bastante antiguo, pero recientemente tuve que hacer algo similar ... Después de ver lo difícil que es, se me ocurrió una solución mucho más simple:
En mi caso, necesitaba un EditText que tuviera la capacidad de borrar el texto con un botón. Quería que se pareciera a SearchView, pero por varias razones no quería usar esa clase. El siguiente ejemplo muestra cómo logré esto. Aunque no tiene que ver con el cambio de enfoque, los principios son los mismos y pensé que sería más beneficioso publicar un código de trabajo real que armar un ejemplo que puede no funcionar exactamente como pretendía:
Aquí está mi diseño: clearable_edit_text.xml
Y aquí está la clase que infla ese diseño: ClearableEditText.java
Para que esta respuesta esté más en línea con la pregunta, se deben seguir los siguientes pasos:
fuente
y si dibujable está a la izquierda, esto te ayudará. (para aquellos que trabajan con diseño RTL)
fuente
Simplemente copie y pegue el siguiente código y funciona.
fuente
Ninguna de las soluciones anteriores funcionó para mí en Xamarin Android . Pude conseguir que el escucha de clics dibujable correcto funcionara de la siguiente manera:
Cree el siguiente
OnEditTextTouch
escucha de eventos:Suscríbase al evento Touch:
fuente
Todo es genial, pero ¿por qué no hacerlo realmente simple?
Me he enfrentado a eso también no hace mucho tiempo ... y el touchlistiner de Android funciona muy bien, pero ofrece una limitación en el uso ... y encontré otra solución y espero que eso te ayude:
Ahora puede crear un escucha o evento ImageClick y hacer lo que quiera con el texto. Este archivo edittext_round_corners.xml
fuente
EditText
debe serandroid:background="@android:color/transparent"
.Es mejor tener ImageButton a la derecha del texto de edición y dar un margen de diseño negativo para superponerse con el texto de edición. Establecer oyente en ImageButton y realizar operaciones.
fuente
fuente
fuente
para el oyente de clic izquierdo dibujable
fuente
Se supone que no se puede hacer clic en los dibujos compuestos. Es más limpio usar vistas separadas en un LinearLayout horizontal y usar un controlador de clic sobre ellas.
fuente
Para cualquiera que no quiera implementar el monstruoso manejo de clics. Puedes lograr lo mismo con a
RelativeLayout
. Con eso incluso tiene libre manejo del posicionamiento del dibujable.La
ImageView
posición será la misma que usaríadrawableEnd
, además de que no necesita todo el manejo del oyente táctil. Solo un oyente de clics para elImageView
y ya está listo.fuente
Esto funciona para mí :) que esto también te ayude
fuente
He visto varias soluciones pero ninguna de ellas me convenció. Muy complicado o demasiado simple (no reutilizable).
Este es mi enfoque favorito en este momento:
Y este es el oyente táctil reutilizable:
Puedes ver el Gist aquí.
fuente
Siga el código a continuación para hacer clic derecho, izquierdo, arriba, abajo dibujable:
}
fuente
Lo he implementado en Kotlin
fuente
Aquí está mi solución simple, simplemente coloque
ImageButton
sobreEditText
:fuente
¡Me gustaría sugerir una manera de dibujar a la izquierda! Probé este código y funciona.
fuente
Implementé @aristo_sh answer en Mono.Droid (Xamarin), ya que es un método anónimo delegado que no puede devolver verdadero o falso, debe tomar e.Event.Handled. También estoy ocultando el teclado al hacer clic
fuente
Compartir mi solución generalizada para manejar eventos dibujables de clic y toque compuestos de TextView.
Primero necesitamos un controlador de eventos táctil:
Ahora puede procesar cualquier evento táctil en cualquier compuesto extraíble de cualquier TextView que desee de esta manera:
¿Solo te interesan los clics? Simplemente filtre por acción MotionEvent:
Nuevamente, podemos manejar fácilmente los clics en cualquier compuesto extraíble de cualquier TextView:
Espero que les haya gustado como a mí. Intentaré mantenerlo actualizado aquí y en lo esencial relacionado si algo cambia.
fuente
He creado una clase simple de escucha táctil personalizada en lugar de un EditText personalizado
}
No habrá dibujable cuando EditText esté en blanco. Se mostrará un dibujo cuando comenzamos a editar para borrar el EditText.
Puedes configurar el oyente táctil
mEditText.setOnTouchListener (nuevo MyTouchListener (mEditText));
fuente