Android EditText 自带清除按钮 的一种解决方案(ViewGroup实现)

在做项目过程中,我们经常用到EditText,并且这个EditText要有清除内容的按钮,如下图:

针对这种情况,本人认为有三种解决方案:

(1)、用相对布局,这个很简单;

(2)、设置EditText的drawableRight,然后重写onTouch方法,进行坐标计算;

(3)、自定义个ViewGroup实现。


本文就是自定义一个ViewGroup实现,源代码如下:

package com.example.testandroid;

import android.content.Context;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.AttributeSet;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;

public class ClearEditText extends ViewGroup implements OnClickListener {

	private TextView clearImage;
	private EditText editText;

	private int clearImageRightPading = 20;

	private TextWatcher textWatcher = new TextWatcher() {

		@Override
		public void onTextChanged(CharSequence s, int start, int before, int count) {

		}

		@Override
		public void beforeTextChanged(CharSequence s, int start, int count, int after) {

		}

		@Override
		public void afterTextChanged(Editable s) {
			if (s.length() == 0) {
				clearImage.setVisibility(View.GONE);
			} else {
				clearImage.setVisibility(View.VISIBLE);
			}
		}
	};

	public ClearEditText(Context context) {
		super(context);
		initViews();
	}

	public ClearEditText(Context context, AttributeSet attrs) {
		super(context, attrs);
		initViews();
	}

	public ClearEditText(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		initViews();
	}

	private void initViews() {
		final Context mContext = getContext();
		clearImage = new TextView(mContext);
		clearImage.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
		clearImage.setOnClickListener(this);
		clearImage.setVisibility(View.GONE);
		editText = new EditText(mContext);
		editText.setLayoutParams(new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
		editText.addTextChangedListener(textWatcher);
		editText.setSingleLine(true);
		addView(editText);
		addView(clearImage);
		requestLayout();
	}

	/**
	 * 设置 清除图片 的资源
	 * 
	 * @param drawableId
	 */
	public void setClearImageDrawableId(int drawableId) {
		clearImage.setBackgroundResource(drawableId);
	}

	/**
	 * 设置EditText的padding(如果调用了{@link #setEditTextBackGround(int)}
	 * 方法,其背景图片是.9图的话,必须要调用此方法)
	 * 
	 * @param paddingLeft
	 *            左边的padding
	 * @param paddinTop
	 *            上边padding
	 * @param paddingRight
	 *            右边padding(这个padding是指文章到 清除图片的 padding)
	 * @param paddingBottom
	 *            下边padding
	 */
	public void setEditTextPadding(int paddingLeft, int paddinTop, int paddingRight, int paddingBottom) {
		paddingRight += clearImageRightPading + clearImage.getBackground().getIntrinsicWidth();
		editText.setPadding(paddingLeft, paddinTop, paddingRight, paddingBottom);
	}

	/**
	 * 设置删除图片距离右边的距离
	 * 
	 * @param clearImageRightPading
	 */
	public void setClearImageRightPading(int clearImageRightPading) {
		this.clearImageRightPading = clearImageRightPading;
		requestLayout();
	}

	/**
	 * 设置EditText的背景</br>Note</br>(1)调用了该方法之后,如果背景图是.9图的话,必须调用
	 * {@link #setEditTextPadding(int, int, int, int)}方法 </br>(2)此方法必须是调用了
	 * {@link #setClearImageDrawableId(int)}之后才能调用
	 * 
	 * @param resid
	 */
	public void setEditTextBackGround(int resid) {
		editText.setBackgroundResource(resid);
	}

	public void setTextColor(int color) {
		editText.setTextColor(color);
	}

	public void setTextColorSize(int size) {
		editText.setTextSize(size);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		int width = MeasureSpec.getSize(widthMeasureSpec);
		// int height = MeasureSpec.getSize(heightMeasureSpec);
		int childCount = getChildCount();
		for (int i = 0; i < childCount; i++) {
			if (i == 0) {
				getChildAt(i).measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY),
						getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
			} else {
				TextView secondView = (TextView) getChildAt(i);
				secondView.measure(MeasureSpec.makeMeasureSpec(secondView.getBackground().getIntrinsicWidth(), MeasureSpec.UNSPECIFIED),
						MeasureSpec.makeMeasureSpec(secondView.getBackground().getIntrinsicHeight(), MeasureSpec.UNSPECIFIED));
			}
		}
		setMeasuredDimension(width, getChildAt(0).getMeasuredHeight());
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		final EditText firstView = editText;
		final View secondView = clearImage;
		final int editTextWith = firstView.getMeasuredWidth();
		final int imageViewWidth = secondView.getMeasuredWidth();
		firstView.layout(0, 0, editTextWith, firstView.getMeasuredHeight());
		final int top = (firstView.getMeasuredHeight() - secondView.getMeasuredHeight()) >> 1;
		secondView.layout(editTextWith - imageViewWidth - clearImageRightPading, top, editTextWith - clearImageRightPading, top
				+ secondView.getMeasuredHeight());
	}

	@Override
	public void onClick(View v) {
		editText.setText("");
	}
}


在xml布局很简单,如下:

 <com.example.testandroid.ClearEditText
        android:id="@+id/myedit"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >
    </com.example.testandroid.ClearEditText>


调用很很简单:

ClearEditText clearEditText = (ClearEditText) getView().findViewById(R.id.myedit);
		clearEditText.setClearImageDrawableId(R.drawable.clear_edittext_selector);
		clearEditText.setEditTextBackGround(R.drawable.bg_tab_search_edit);
		clearEditText.setEditTextPadding(30, 20, 20, 20);


完毕,有什么不好的,大家多多指教

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值