美文网首页
Android EditText抢占焦点问题解决方法

Android EditText抢占焦点问题解决方法

作者: 貌似很有道理呢 | 来源:发表于2017-04-08 20:34 被阅读1872次

    在editText 抢占焦点的问题上,采用拦截事件的方式处理,自定义View。
    1.继承类View类,如图所示输入框,继承自EditText,点击右侧删除按钮,editText数据清空


    此输入框代码如下:
    当通过以下代码设置右侧删除图片时

    setCompoundDrawablesWithIntrinsicBounds(null, null, mRightIcon, null);
    editText会抢占焦点,点击drawable 无法响应,解决方法可通过触摸的位置,来判断用户的需求。
    `

        /**
     * 监听删除操作
     */
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (!this.isEnabled() || event.getAction() != MotionEvent.ACTION_UP) {
            return super.onTouchEvent(event);
        }
        // 清除按钮,获取焦点,控件可用时清空
        Drawable rightIcon = mRightIconLoader.getRightIcon();
        if (rightIcon != null) {
            int x = (int) event.getX();
            int y = (int) event.getY();
    
            int padding = this.getPaddingRight();
            if (x >= (this.getRight() - this.getLeft()
                    - rightIcon.getBounds().width() - padding - PRESS_MARGIN)
                    && x <= (this.getRight() - this.getLeft())
                    && y >= (this.getPaddingBottom() - PRESS_MARGIN)
                    && y <= (this.getHeight() - this.getPaddingTop() + PRESS_MARGIN)) {
      //监听器,让外部获得事件
        mRightIconLoader.onRightIconTouched();
                event.setAction(MotionEvent.ACTION_CANCEL);
            } else {
                onTouch();
            }
        } else {
            onTouch();
        }
        return super.onTouchEvent(event);
    } `  
    

    2.自定义组合类View,继承自ViewGroup


    在ViewGroup类对事件进行拦截,不传给子View,使用onInterceptTouchEvent()用于处理事件并改变事件的传递方向。
    `
          @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        if (!this.isEnabled() || event.getAction() != MotionEvent.ACTION_UP) {
            return super.onTouchEvent(event);
        }
        int x = (int) event.getX();
        int y = (int) event.getY();
        // 清除按钮,获取焦点,控件可用时清空
        if (mImageListener != null) {
            Drawable rightIcon = mImageListener.getIcon();
            if (rightIcon != null) {
                BitmapDrawable bitmapDrawable = (BitmapDrawable) rightIcon;
                mJDRImageView.setImageBitmap(bitmapDrawable.getBitmap());
            }
        }
        if (x >= mJDRImageView.getLeft() && x <= mJDRImageView.getRight() && y >= mJDRImageView.getTop() && y <= mJDRImageView.getBottom()) {
            if (mImageListener != null) {
                mImageListener.onIconTouched();
            }
            event.setAction(MotionEvent.ACTION_CANCEL);
    
        }
        return super.onInterceptTouchEvent(event);
    }`

    相关文章

      网友评论

          本文标题:Android EditText抢占焦点问题解决方法

          本文链接:https://www.haomeiwen.com/subject/efkrattx.html