drawableRight中图标的点击事件

布局写的稍微多点的人都知道,有时候我们需要给控件设置drawableRight或者是drawableleft这样的属性为控件添加个图标之类的,比方说我们做登录界面的时候,账号的框框里可能要显示一个人头的小图标,密码框可能要显示一个小锁的图标。当然这些只是显示的问题,不会有太大难度。现在其实有很多的图标显示在右边的,而且这些小图标都是需要响应一些点击事件的,这个我们该怎么做呢,显然Onclick肯定是不可以的。那有人也许会想,可能会有相应的点击事件,其实我想说这个真的没有。下面我就来简单说一下该如何去解决drawableRight这个图标的事件。资源链接:http://download.csdn.net/detail/u014128885/8610521

最终效果:


工程结构图:

一、现在drawable文件夹里建一个选择器,选择器的名称为delete_selector.xml,当然名称可以随意取,这个不是重点,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<selector
  xmlns:android="http://schemas.android.com/apk/res/android">
  <!--item里面的drawable属性表示当文本框长度不为零的时候显示的图片 -->
    <item android:state_pressed="true" android:drawable="@drawable/search_clear_normal" />
    <!-- item里面的drawable属性表示当文本框长度为零的时候显示的图片,这里都是一样的图片,大家可以测试一下 -->
    <item android:drawable="@drawable/search_clear_normal" />
</selector>

二、我们需要建立一个类,这个类其实就是一个自定义的控件,此类需要继承View的子控件,你需要写什么自定义控件就写什么,完全根据自己的需求。

package com.example.clearedittext;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnFocusChangeListener;
import android.view.animation.Animation;
import android.view.animation.CycleInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.EditText;
import android.widget.Toast;

public class ClearEditText extends EditText implements  
        OnFocusChangeListener, TextWatcher { 
	/**
	 * 删除按钮的引用
	 */
    private Drawable mClearDrawable; 
    /**
     * 控件是否有焦点
     */
    private boolean hasFoucs;
 
//    private Context context;
    public ClearEditText(Context context) { 
    	this(context, null); 
    } 
 
    public ClearEditText(Context context, AttributeSet attrs) { 
    	//这里构造方法也很重要,不加这个很多属性不能再XML里面定义
    	this(context, attrs, android.R.attr.editTextStyle); 
    } 
    
    public ClearEditText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }
    
    
    private void init() { 
    	//获取EditText的DrawableRight,假如没有设置我们就使用默认的图片
    	mClearDrawable = getCompoundDrawables()[2]; 
        if (mClearDrawable == null) { 
//        	throw new NullPointerException("You can add drawableRight attribute in XML");
        	mClearDrawable = getResources().getDrawable(R.drawable.delete_selector); 
        } 
        
        mClearDrawable.setBounds(0, 0, mClearDrawable.getIntrinsicWidth(), mClearDrawable.getIntrinsicHeight()); 
        //默认设置隐藏图标
        setClearIconVisible(false); 
        //设置焦点改变的监听
        setOnFocusChangeListener(this); 
        //设置输入框里面内容发生改变的监听
        addTextChangedListener(this); 
    } 
 
 
    /**
     * 因为我们不能直接给EditText设置点击事件,所以我们用记住我们按下的位置来模拟点击事件
     * 当我们按下的位置 在  EditText的宽度 - 图标到控件右边的间距 - 图标的宽度  和
     * EditText的宽度 - 图标到控件右边的间距之间我们就算点击了图标,竖直方向就没有考虑
     */
    @Override 
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_UP) {
			if (getCompoundDrawables()[2] != null) {

				boolean touchable = event.getX() > (getWidth() - getTotalPaddingRight())
						&& (event.getX() < ((getWidth() - getPaddingRight())));
				
				if (touchable) {
					//里面写上自己想做的事情,也就是DrawableRight的触发事件
					this.setText("");
					try {
						Toast.makeText(getContext(), "您触发了事件", Toast.LENGTH_SHORT).show();
					} catch (Exception e) {
						// TODO: handle exception
					}
					
				}
			}
		}

		return super.onTouchEvent(event);
	}
 
    /**
     * 当ClearEditText焦点发生变化的时候,判断里面字符串长度设置清除图标的显示与隐藏
     */
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
    	this.hasFoucs = hasFocus;
        if (hasFocus) { 
            setClearIconVisible(getText().length() > 0); 
        } else { 
            setClearIconVisible(false); 
        } 
    } 
 
 
    /**
     * 设置清除图标的显示与隐藏,调用setCompoundDrawables为EditText绘制上去
     * @param visible
     */
    protected void setClearIconVisible(boolean visible) { 
    	//如果你想让它一直显示DrawableRight的图标,并且还需要让它触发事件,直接把null改成mClearDrawable即可
        Drawable right = visible ? mClearDrawable : null; 
        setCompoundDrawables(getCompoundDrawables()[0], 
                getCompoundDrawables()[1], right, getCompoundDrawables()[3]); 
    } 
    
    //后面的代码无需更改,只需要粘贴进去即可,如果有不需要的可以删除,当然不删除也不会出错。
    /**
     * 当输入框里面内容发生变化的时候回调的方法
     */
    @Override 
    public void onTextChanged(CharSequence s, int start, int count, 
            int after) { 
            	if(hasFoucs){
            		setClearIconVisible(s.length() > 0);
            	}
    } 
 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, 
            int after) { 
         
    } 
 
    @Override 
    public void afterTextChanged(Editable s) { 
         
    } 
    
   
    /**
     * 设置晃动动画
     */
    public void setShakeAnimation(){
    	this.setAnimation(shakeAnimation(5));
    }
    
    
    /**
     * 晃动动画
     * @param counts 1秒钟晃动多少下
     * @return
     */
    public static Animation shakeAnimation(int counts){
    	Animation translateAnimation = new TranslateAnimation(0, 10, 0, 0);
    	translateAnimation.setInterpolator(new CycleInterpolator(counts));
    	translateAnimation.setDuration(1000);
    	return translateAnimation;
    }
 
 
}
三、主xml文件建立一个控件,其实控件也是一个类,但是总是有人忘记控件是个类,就像总是很多人忘记类的类型一样,控件也是一个类型,所以只要在xml里面引用这个类既可以得到此自定义控件,其实很多初学者说自己不会自定义控件,其实自定义控件也是很简单的,只要记住,控件是个类,我要用控件只需要引用这个类就行了,初始化也一样,findViewByid()前面的括号里面填写的就不是EditText了,填写的应该是类名才对,在这里我啰嗦了两句希望大家理解。下面我贴出activity_main.xml文件代码,里面有两个自定义控件和一个button,做的是登录效果。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">


    <com.example.clearedittext.ClearEditText
        android:id="@+id/username"
        android:layout_marginTop="60dp"
        android:layout_width="fill_parent"
        android:drawableLeft="@drawable/icon_user"
        android:layout_marginLeft="10dip"
        android:layout_marginRight="10dip"
        android:singleLine="true"
        android:drawableRight="@drawable/delete_selector"
        android:hint="输入用户名"
        android:layout_height="wrap_content" >

    </com.example.clearedittext.ClearEditText>

    <com.example.clearedittext.ClearEditText
        android:id="@+id/password"
        android:layout_marginLeft="10dip"
        android:layout_marginRight="10dip"
        android:layout_marginTop="10dip"
        android:drawableLeft="@drawable/account_icon"
        android:hint="输入密码"
        android:singleLine="true"
        android:password="true"
        android:drawableRight="@drawable/delete_selector"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/username" >
    </com.example.clearedittext.ClearEditText>

    <Button
        android:id="@+id/login"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dip"
        android:layout_marginRight="10dip"
        android:textSize="18sp"
        android:textColor="@android:color/white"
        android:layout_below="@+id/password"
        android:layout_marginTop="25dp"
        android:text="登录" />

</RelativeLayout>


好了现在是 算是基本完成了,下面我把MainActivity的代码贴出来。

package com.example.clearedittext;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
	private Toast mToast;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		final ClearEditText username = (ClearEditText) findViewById(R.id.username);
		final ClearEditText password = (ClearEditText) findViewById(R.id.password);
		
		((Button) findViewById(R.id.login)).setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				if(TextUtils.isEmpty(username.getText())){
					//设置晃动
					username.setShakeAnimation();
					//设置提示
					showToast("用户名不能为空");
					return;
				}
				
				if(TextUtils.isEmpty(password.getText())){
					password.setShakeAnimation();
					showToast("密码不能为空");
					return;
				}
			}
		});
	}
	
	/**
	 * 显示Toast消息
	 * @param msg
	 */
	private void showToast(String msg){
		if(mToast == null){
			mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
		}else{
			mToast.setText(msg);
		}
		mToast.show();
	}


}
其实最主要的还是初始化控件那两个,其他的和平时使用EditText控件没有什么两样,控件一初始化就有响应的事件,因为事件都在ClearEditText里面写好了,只要一初始化控件就会有相应的事件产生,所以没什么需要做的。



  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值