Android EditText 自带清除按钮 (ViewGroup实现)
来源:互联网 发布:立讯精密 知乎 编辑:程序博客网 时间:2024/06/04 11:26
原文链接:http://blog.csdn.net/freesonhp/article/details/30989923
针对这种情况,本人认为有三种解决方案:
(1)、用相对布局,这个很简单;
(2)、设置EditText的drawableRight,然后重写onTouch方法,进行坐标计算;
(3)、自定义个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);
0 0
- Android EditText 自带清除按钮 (ViewGroup实现)
- Android EditText 自带清除按钮 的一种解决方案(ViewGroup实现)
- Android EditText 自带清除按钮 的一种解决方案(ViewGroup实现)
- 自定义EditText,自带清除内容按钮
- 自定义EditText,自带清除内容按钮
- Android带清除按钮的EditText
- Android 实现自定义自带删除按钮的EditText(带有搜索接口)
- 带清除按钮的EditText~
- 自定义EditText:带清除按钮的EditText
- Android中自定义EditText控件(自带清除功能等)
- Android实现自带横线的EditText
- Android实现自带横线的EditText
- jquery十几行代码实现输入框自带清除按钮
- 一个带清除按钮的EditText-->ClearEditText
- LayoutInflater作用及使用--自定义EditText,自带清除内容按钮
- Android自定义控件实现带有清除按钮的EditText
- ClearEditText,自带清除功能的EditText
- ClearEditText,自带清除功能的EditText
- REST
- 一个简单的基于JSTL的分页
- Android从零开始之重新认识Activity--生命周期
- 搭建安卓盒子开发调试环境
- 简要分析Uboot是如何启动内核
- Android EditText 自带清除按钮 (ViewGroup实现)
- 存储过程测试流程--以MySQL为例
- 遗传算法(Genetic Algorithm)
- iOS layout机制相关方法
- HashMap源码
- Structural Patterns Part 7/7: Proxy Pattern
- Android - android.view.InflateException: Binary XML file line #: Error inflating class fragment
- HashSet源码
- JDBC结合MySql完成增删改查