Adicionei uma imagem à direita do texto em um EditText
widget, usando o seguinte 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" />
Mas quero limpar EditText
quando a imagem incorporada é clicada. Como posso fazer isso?
Respostas:
Na verdade, você não precisa estender nenhuma classe. Digamos que eu tenho um EditText editComment com um drawableRight
nós
getRawX()
porque queremos obter a posição real do toque na tela, não em relação aos pais.Para chegar ao lado esquerdo, clique
fonte
event.getRawX()
vez deevent.getX()
@AngeloSgetRight()
obter o direito do TextView, que não será o direito do desenho se houver preenchimento. Adicionar- editComment.getPaddingRight()
ao final da suaif
declaração deve funcionar.Muito, muito bom, obrigado a todos que contribuíram para esta discussão. Portanto, se você não quiser lidar com a inconveniência de estender a classe, faça o seguinte (implementado apenas para o drawable correto)
E aqui está a implementação do ouvinte básico com base na resposta de @ Mark
fonte
v.getRight()
porv.getWidth()
.fuzz
efetivamente torna a área tocável um pouco maior, facilitando o toque na pequena gaveta.Considere o seguinte. Não é a solução mais elegante, mas funciona, eu apenas a testei.
Crie uma
EditText
classe personalizadaCustomEditText.java
:Altere o XML do layout para este (onde
com.example
está o nome do pacote do projeto atual):Por fim, adicione isso (ou algo semelhante) à sua atividade:
Eu posso estar um pouco desconfortável com o cálculo dos limites de toque para o drawable aninhado, mas você entendeu.
Eu espero que isso ajude.
fonte
TextView
vez deEditText
. Peguei o código e, se eu clicar noTextView
(não no ícone, mas em qualquer espaço noTextView
), o métodoonTouchEvent(MotionEvent event)
será chamado. Então, eu posso implementarOnClickListener
normalmente,TextView
sem nenhuma classe adicional, comoCustomEditText
this.getRight()-rBounds.width()
por que não usarthis.getMeasuredWidth() - this.getCompoundPaddingRight()
? Ele não cuidaria do estofamento da gaveta e também se livraria do limite da gaveta?EditText
do não suportam tonalidade de widgets adequada ao usar o appcompat em dispositivos pré-pirulito. UseAppCompatEditText
como uma classe pai de sua EditText costumeEu criei uma classe abstrata útil DrawableClickListener que implementa OnTouchListener .
Além da classe DrawableClickListener , também criei 4 classes abstratas adicionais que estendem a classe DrawableClickListener e manipulam o clique na área de desenho para o quadrante correto.
Ponto a considerar
Uma coisa a considerar é que as imagens não são redimensionadas se feitas dessa maneira; portanto, as imagens devem ser dimensionadas corretamente antes de serem colocadas no pastas res / drawable .
Se você definir um LinearLayout contendo um ImageView e um TextView , é muito mais fácil manipular o tamanho da imagem que está sendo exibida.
activity_my.xml
MyActivity.java
DrawableClickListener.java
fonte
É muito simples. Digamos que você tenha um drawable no lado esquerdo do seu EditText 'txtsearch'. A seguir fará o truque.
Se você deseja desenhar direito, altere a instrução if para:
Da mesma forma, você pode fazer isso para todos os drawables compostos.
Essa chamada de método retorna todo o preenchimento desse lado, incluindo todos os drawables. Você pode usar isso mesmo para TextView, Button etc.
Clique aqui para obter referência no site do desenvolvedor do Android.
fonte
Eu acho que é muito mais fácil se usarmos alguns truques :)
Feito
fonte
RelativeLayout
para obter um posicionamento adequado, parece menos complicado do que outras soluções e muito menos código para manter.O uso dessa última contribuição
contains(x,y)
não funcionará diretamente no resultado degetBounds()
(exceto por coincidência, ao usar drawables "esquerdo"). OgetBounds
método fornece apenas osRect
pontos de definição do item extraível normalizado com origem em 0,0 - portanto, você realmente precisa fazer as contas da postagem original para descobrir se o clique está na área do extraível no contexto do contendo as dimensões do EditText, mas altere para superior, direita, esquerda etc. Como alternativa, você pode descrever umRect
que tenha coordenadas realmente relativas à sua posição noEditText
contêiner e usarcontains()
, embora no final você esteja fazendo a mesma matemática.A combinação dos dois fornece uma solução bastante completa. Adicionei apenas um atributo de instância
consumesEvent
que permite ao usuário da API decidir se o evento click deve ser repassado ou não, usando seu resultado para definirACTION_CANCEL
ou não.Além disso, eu não posso ver por que o
bounds
eactionX
,actionY
os valores são os atributos exemplo, em vez de apenas locais na pilha.Aqui está um recorte de uma implementação com base no que foi dito acima. Ele corrige um problema que, para consumir adequadamente o evento, você precisa retornar falso. Ele adiciona um fator "fuzz" a. No meu caso de uso de um ícone de controle de voz em um
EditText
campo, achei difícil clicar; portanto, o difuso aumenta os limites efetivos que são considerados clicar na gaveta. Para mim15
funcionou bem. Eu só precisava,drawableRight
para não inserir a matemática nos outros, para economizar espaço, mas você vê a ideia.fonte
Ampliando a ideia de RyanM, criei uma versão mais flexível, que suporta todos os tipos de desenhos (superior, inferior, esquerda, direita). Enquanto o código abaixo estende o TextView, adaptá-lo para um EditText é apenas um caso de trocar "estende o TextView" por "estende o EditText". Instanciação do widget a partir do XML é idêntica à do exemplo do RyanM, exceto o nome do widget.
O DrawableClickListener é tão simples quanto isto:
E então a implementação real:
ps: se você não definir o ouvinte, tocar no TextView causará uma NullPointerException. Você pode adicionar um pouco mais de paranóia ao código.
fonte
Kotlin é uma ótima linguagem em que cada classe pode ser estendida com novos métodos. Vamos introduzir um novo método para a classe EditText, que trará cliques para o drawable direito.
Você pode ver que a função de retorno de chamada é um argumento que é chamado quando o usuário clica para desenhar à direita.
fonte
está trabalhando para mim,
fonte
Eu sei que isso é bastante antigo, mas recentemente tive que fazer algo semelhante ... Depois de ver como isso é difícil, eu vim com uma solução muito mais simples:
No meu caso, eu precisava de um EditText que pudesse limpar o texto com um botão. Eu queria que ele se parecesse com o SearchView, mas por vários motivos, não quis usar essa classe. O exemplo abaixo mostra como eu consegui isso. Mesmo que isso não tenha a ver com a mudança de foco, os princípios são os mesmos e achei que seria mais benéfico publicar código de trabalho real do que reunir um exemplo que pode não funcionar exatamente como eu pretendia:
Aqui está o meu layout: clearable_edit_text.xml
E aqui está a classe que infla esse layout: ClearableEditText.java
Para tornar esta resposta mais alinhada com a pergunta, as seguintes etapas devem ser seguidas:
fonte
e se o drawable estiver à esquerda, isso o ajudará. (para quem trabalha com layout RTL)
fonte
Basta copiar e colar o código a seguir e ele faz o truque.
fonte
Nenhuma das soluções anteriores funcionou para mim no Xamarin Android . Consegui fazer com que o ouvinte de clique extraível correto funcionasse usando o seguinte:
Crie o seguinte
OnEditTextTouch
ouvinte de evento:Inscreva-se no evento Touch:
fonte
É tudo ótimo, mas por que não torná-lo realmente simples?
Eu já enfrentei isso também não faz muito tempo ... e o Android touchlistiner funciona muito bem, mas dá limitações no uso ... e vim para outra solução e espero que ajude você:
Agora você pode criar ouvinte ou evento ImageClick e fazer o que quiser com texto. Este arquivo edittext_round_corners.xml
fonte
EditText
deve serandroid:background="@android:color/transparent"
.É melhor ter o ImageButton à direita do texto de edição e dar margem de layout negativa para se sobrepor ao texto de edição. Defina o listener no ImageButton e execute operações.
fonte
fonte
fonte
para ouvinte de clique extraível esquerdo
fonte
Drawables compostos não devem ser clicáveis. É mais limpo usar visualizações separadas em um LinearLayout horizontal e usar um manipulador de cliques nelas.
fonte
Para quem não deseja implementar a manipulação monstruosa de cliques. Você pode conseguir o mesmo com a
RelativeLayout
. Com isso, você ainda tem manuseio gratuito do posicionamento do drawable.A
ImageView
posição será a mesma que você usariadrawableEnd
- além de não precisar de todo o manuseio do ouvinte. Apenas um ouvinte de cliques para oImageView
e você está pronto para ir.fonte
Isso funciona para mim :) pode ajudar você também
fonte
Eu já vi várias soluções, mas não fui convencido por nenhuma delas. Muito complicado ou muito simples (não reutilizável).
Esta é a minha abordagem favorita no momento:
E este é o ouvinte de toque reutilizável:
Você pode olhar para o Gist aqui.
fonte
Siga o código abaixo para desenhar à direita, esquerda, cima, baixo, clique em:
}
fonte
Eu implementei no Kotlin
fonte
Aqui está a minha solução simples, basta colocar
ImageButton
sobreEditText
:fonte
Gostaria de sugerir um caminho para a esquerda do drawable! Eu tentei esse código e funciona.
fonte
Eu implementei a resposta @aristo_sh no Mono.Droid (Xamarin), já que é um método anônimo delegado que você não pode retornar verdadeiro ou falso, você precisa tirar o e.Event.Handled. Também estou ocultando o teclado ao clicar
fonte
Compartilhando minha solução generalizada para lidar com eventos de clique e toque desenhados com compostos do TextView.
Primeiro, precisamos de um manipulador de eventos de toque:
Agora você pode processar qualquer evento de toque em qualquer desenho composto de qualquer TextView que você gosta desta maneira:
Interessado apenas em cliques? Basta filtrar pela ação MotionEvent:
Novamente, podemos manipular cliques com facilidade em qualquer drawable composto de qualquer TextView:
Espero que você tenha gostado como eu. Vou tentar mantê-lo atualizado aqui e na essência relacionada, se alguma coisa mudar.
fonte
Criei uma classe simples de ouvinte de toque personalizado em vez de um EditText personalizado
}
Não haverá nenhum desenho quando o EditText estiver em branco. Um drawable será exibido quando começamos a editar para limpar o EditText.
Você pode simplesmente definir o ouvinte de toque
mEditText.setOnTouchListener (novo MyTouchListener (mEditText));
fonte