Android EditText 自带清除按钮 的一种解决方案(ViewGroup实现)
16lz
2021-01-23
http://blog.csdn.net/freesonhp/article/details/30989923
http://blog.csdn.net/freesonhp/article/details/30989923
http://blog.csdn.net/freesonhp/article/details/30989923
http://blog.csdn.net/freesonhp/article/details/30989923http://blog.csdn.net/freesonhp/article/details/30989923
http://blog.csdn.net/freesonhp/article/details/30989923
Android EditText 自带清除按钮 的一种解决方案(ViewGroup实现)
分类:Android 2014-06-15 15:36 188人阅读 评论(0) 收藏 举报在做项目过程中,我们经常用到EditText,并且这个EditText要有清除内容的按钮,如下图:
针对这种情况,本人认为有三种解决方案:
(1)、用相对布局,这个很简单;
(2)、设置EditText的drawableRight,然后重写onTouch方法,进行坐标计算;
(3)、自定义个ViewGroup实现。
本文就是自定义一个ViewGroup实现,源代码如下:
[java] view plain copy- packagecom.example.testandroid;
- importandroid.content.Context;
- importandroid.text.Editable;
- importandroid.text.TextWatcher;
- importandroid.util.AttributeSet;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.view.ViewGroup;
- importandroid.widget.EditText;
- importandroid.widget.TextView;
- publicclassClearEditTextextendsViewGroupimplementsOnClickListener{
- privateTextViewclearImage;
- privateEditTexteditText;
- privateintclearImageRightPading=20;
- privateTextWatchertextWatcher=newTextWatcher(){
- @Override
- publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){
- }
- @Override
- publicvoidbeforeTextChanged(CharSequences,intstart,intcount,intafter){
- }
- @Override
- publicvoidafterTextChanged(Editables){
- if(s.length()==0){
- clearImage.setVisibility(View.GONE);
- }else{
- clearImage.setVisibility(View.VISIBLE);
- }
- }
- };
- publicClearEditText(Contextcontext){
- super(context);
- initViews();
- }
- publicClearEditText(Contextcontext,AttributeSetattrs){
- super(context,attrs);
- initViews();
- }
- publicClearEditText(Contextcontext,AttributeSetattrs,intdefStyle){
- super(context,attrs,defStyle);
- initViews();
- }
- privatevoidinitViews(){
- finalContextmContext=getContext();
- clearImage=newTextView(mContext);
- clearImage.setLayoutParams(newViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
- clearImage.setOnClickListener(this);
- clearImage.setVisibility(View.GONE);
- editText=newEditText(mContext);
- editText.setLayoutParams(newViewGroup.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
- editText.addTextChangedListener(textWatcher);
- editText.setSingleLine(true);
- addView(editText);
- addView(clearImage);
- requestLayout();
- }
- /**
- *设置清除图片的资源
- *
- *@paramdrawableId
- */
- publicvoidsetClearImageDrawableId(intdrawableId){
- clearImage.setBackgroundResource(drawableId);
- }
- /**
- *设置EditText的padding(如果调用了{@link#setEditTextBackGround(int)}
- *方法,其背景图片是.9图的话,必须要调用此方法)
- *
- *@parampaddingLeft
- *左边的padding
- *@parampaddinTop
- *上边padding
- *@parampaddingRight
- *右边padding(这个padding是指文章到清除图片的padding)
- *@parampaddingBottom
- *下边padding
- */
- publicvoidsetEditTextPadding(intpaddingLeft,intpaddinTop,intpaddingRight,intpaddingBottom){
- paddingRight+=clearImageRightPading+clearImage.getBackground().getIntrinsicWidth();
- editText.setPadding(paddingLeft,paddinTop,paddingRight,paddingBottom);
- }
- /**
- *设置删除图片距离右边的距离
- *
- *@paramclearImageRightPading
- */
- publicvoidsetClearImageRightPading(intclearImageRightPading){
- this.clearImageRightPading=clearImageRightPading;
- requestLayout();
- }
- /**
- *设置EditText的背景</br>Note</br>(1)调用了该方法之后,如果背景图是.9图的话,必须调用
- *{@link#setEditTextPadding(int,int,int,int)}方法</br>(2)此方法必须是调用了
- *{@link#setClearImageDrawableId(int)}之后才能调用
- *
- *@paramresid
- */
- publicvoidsetEditTextBackGround(intresid){
- editText.setBackgroundResource(resid);
- }
- publicvoidsetTextColor(intcolor){
- editText.setTextColor(color);
- }
- publicvoidsetTextColorSize(intsize){
- editText.setTextSize(size);
- }
- @Override
- protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
- super.onMeasure(widthMeasureSpec,heightMeasureSpec);
- intwidth=MeasureSpec.getSize(widthMeasureSpec);
- //intheight=MeasureSpec.getSize(heightMeasureSpec);
- intchildCount=getChildCount();
- for(inti=0;i<childCount;i++){
- if(i==0){
- getChildAt(i).measure(MeasureSpec.makeMeasureSpec(getWidth(),MeasureSpec.EXACTLY),
- getDefaultSize(getSuggestedMinimumHeight(),heightMeasureSpec));
- }else{
- TextViewsecondView=(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
- protectedvoidonLayout(booleanchanged,intl,intt,intr,intb){
- finalEditTextfirstView=editText;
- finalViewsecondView=clearImage;
- finalinteditTextWith=firstView.getMeasuredWidth();
- finalintimageViewWidth=secondView.getMeasuredWidth();
- firstView.layout(0,0,editTextWith,firstView.getMeasuredHeight());
- finalinttop=(firstView.getMeasuredHeight()-secondView.getMeasuredHeight())>>1;
- secondView.layout(editTextWith-imageViewWidth-clearImageRightPading,top,editTextWith-clearImageRightPading,top
- +secondView.getMeasuredHeight());
- }
- @Override
- publicvoidonClick(Viewv){
- editText.setText("");
- }
- }
在xml布局很简单,如下: [java] view plain copy
- <com.example.testandroid.ClearEditText
- android:id="@+id/myedit"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content">
- </com.example.testandroid.ClearEditText>
- ClearEditTextclearEditText=(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);
完毕,有什么不好的,大家多多指教
更多相关文章
- android读取图片
- Android 使用Glide实现圆形和圆角图片
- 2012-7-20 android 图片叠加效果——两种方法
- Android右滑返回上一个界面的实现方法
- 系统关闭GPRS数据流量和 GPS的方法
- Android添加半透明操作提示的方法