android - 如何处理 TextInputEditText 的复合绘图上的 onclick 事件?

标签 android material-design android-textinputedittext

如何检测 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>

关于android - 如何处理 TextInputEditText 的复合绘图上的 onclick 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55091690/

相关文章:

android - 下拉按钮/微调器,就像谷歌设计规范中的那些

java - [安卓] : java. lang.NoSuchFieldError: No field error_color_material

android - 在android中使用Vitamio库播放视频流?

android - 使用数据绑定(bind)和 lambda 的单选按钮 onCheckedChanged

Android - 动态更新布局内容(以获得 "submenu"效果)

android - 找不到 gradle dsl 方法 'compile()'

Android 使用 MaterialDatePicker 和 TextInputLayout

android - TextInputLayout 轮廓提示颜色

android - Android 数字键盘更改为字母数字键盘

java - 从相机预览类创建/使用 YUV 图像缓冲区