android - 如何处理 TextInputEditText 的复合可绘制对象上的 onclick 事件?
问题描述
如何检测 a 的复合可绘制对象上的点击事件TextInputEditText
?
解决方案
使用以下覆盖版本的TextInputEditText
, 并调用setOnDrawableClickedListener
.
如果你在编辑文本的末尾设置你的drawable可能会比在开始时更好,因为当前版本TextInputLayout
的drawable在开始时会产生相当丑陋的结果。
示例布局在下面给出。(android:drawablePadding="10dp"
特别注意使用)。
代码适用于 androidx,但您可以轻松地向后移植到 AppCompat。
package com.twoplay.netplayer.controls;
import android.content.Context;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.google.android.material.textfield.TextInputEditText;
public class TextInputEditTextEx extends TextInputEditText {
private OnDrawableClickedListener onDrawableClickedListener;
public TextInputEditTextEx(Context context) {
super(context);
init();
}
public TextInputEditTextEx(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public TextInputEditTextEx(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
setOnTouchListener(new OnTouchListener() {
private Rect hitBounds = new Rect();
@Override
public boolean onTouch(View v, MotionEvent event) {
float x = event.getX();
float y = event.getY();
int hitDrawable = -1;
if (x < getCompoundPaddingLeft())
{
hitDrawable = 0;
hitBounds.set(0,0,getCompoundPaddingLeft(),getHeight());
}
if (x > getWidth()-getCompoundPaddingRight())
{
hitDrawable = 2;
hitBounds.set(getCompoundPaddingRight(),0,getWidth(),getHeight());
}
if (hitDrawable != -1)
{
int action = event.getAction();
if (action == MotionEvent.ACTION_UP)
{
onDrawableClicked(hitDrawable,hitBounds);
}
return true;
}
return false;
}
});
}
private void onDrawableClicked(int i, Rect bounds) {
if (onDrawableClickedListener != null)
{
onDrawableClickedListener.onDrawableClicked(this,i,bounds);
}
}
public interface OnDrawableClickedListener {
void onDrawableClicked(View v, int drawable, Rect bounds);
}
public void setOnDrawableClickedListener(OnDrawableClickedListener listener)
{
this.onDrawableClickedListener = listener;
}
}
样本布局:
<com.google.android.material.textfield.TextInputLayout
android:id="@+id/playlist_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/playlist_name" >
<com.twoplay.netplayer.controls.TextInputEditTextEx
android:id="@+id/playlist_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:inputType="textCapWords"
android:drawableEnd="@drawable/ic_more_horiz_black_24dp"
android:drawablePadding="10dp" />
</com.google.android.material.textfield.TextInputLayout>
推荐阅读
- html - 如何使用两个单独的子 div 的元素更改显示顺序?
- javascript - 在 iOS 浏览器中通过 Ajax 请求的图像未显示,但已加载并在 DOM 中
- highcharts - highcharts 条形图应从该行开始
- laravel - laravel 社交名流不使用 JWT 身份验证
- django - Django 构建错误运行时翻译
- kubernetes - 多个入口在 kubernetes 中不起作用
- java - JPA 请求问题:查询方法 public abstract java.util.List 的验证失败
- javascript - 自动触发点击 JavaScript 功能
- makefile - makefile“删除中间文件”只是有时
- ruby - Rspec 不模拟请求