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 188人阅读 评论(0) 收藏 举报

在做项目过程中,我们经常用到EditText,并且这个EditText要有清除内容的按钮,如下图:Android EditText 自带清除按钮 的一种解决方案(ViewGroup实现)_第1张图片

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

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

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

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


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

[java] view plain copy
  1. packagecom.example.testandroid;
  2. importandroid.content.Context;
  3. importandroid.text.Editable;
  4. importandroid.text.TextWatcher;
  5. importandroid.util.AttributeSet;
  6. importandroid.view.View;
  7. importandroid.view.View.OnClickListener;
  8. importandroid.view.ViewGroup;
  9. importandroid.widget.EditText;
  10. importandroid.widget.TextView;
  11. publicclassClearEditTextextendsViewGroupimplementsOnClickListener{
  12. privateTextViewclearImage;
  13. privateEditTexteditText;
  14. privateintclearImageRightPading=20;
  15. privateTextWatchertextWatcher=newTextWatcher(){
  16. @Override
  17. publicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){
  18. }
  19. @Override
  20. publicvoidbeforeTextChanged(CharSequences,intstart,intcount,intafter){
  21. }
  22. @Override
  23. publicvoidafterTextChanged(Editables){
  24. if(s.length()==0){
  25. clearImage.setVisibility(View.GONE);
  26. }else{
  27. clearImage.setVisibility(View.VISIBLE);
  28. }
  29. }
  30. };
  31. publicClearEditText(Contextcontext){
  32. super(context);
  33. initViews();
  34. }
  35. publicClearEditText(Contextcontext,AttributeSetattrs){
  36. super(context,attrs);
  37. initViews();
  38. }
  39. publicClearEditText(Contextcontext,AttributeSetattrs,intdefStyle){
  40. super(context,attrs,defStyle);
  41. initViews();
  42. }
  43. privatevoidinitViews(){
  44. finalContextmContext=getContext();
  45. clearImage=newTextView(mContext);
  46. clearImage.setLayoutParams(newViewGroup.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
  47. clearImage.setOnClickListener(this);
  48. clearImage.setVisibility(View.GONE);
  49. editText=newEditText(mContext);
  50. editText.setLayoutParams(newViewGroup.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
  51. editText.addTextChangedListener(textWatcher);
  52. editText.setSingleLine(true);
  53. addView(editText);
  54. addView(clearImage);
  55. requestLayout();
  56. }
  57. /**
  58. *设置清除图片的资源
  59. *
  60. *@paramdrawableId
  61. */
  62. publicvoidsetClearImageDrawableId(intdrawableId){
  63. clearImage.setBackgroundResource(drawableId);
  64. }
  65. /**
  66. *设置EditText的padding(如果调用了{@link#setEditTextBackGround(int)}
  67. *方法,其背景图片是.9图的话,必须要调用此方法)
  68. *
  69. *@parampaddingLeft
  70. *左边的padding
  71. *@parampaddinTop
  72. *上边padding
  73. *@parampaddingRight
  74. *右边padding(这个padding是指文章到清除图片的padding)
  75. *@parampaddingBottom
  76. *下边padding
  77. */
  78. publicvoidsetEditTextPadding(intpaddingLeft,intpaddinTop,intpaddingRight,intpaddingBottom){
  79. paddingRight+=clearImageRightPading+clearImage.getBackground().getIntrinsicWidth();
  80. editText.setPadding(paddingLeft,paddinTop,paddingRight,paddingBottom);
  81. }
  82. /**
  83. *设置删除图片距离右边的距离
  84. *
  85. *@paramclearImageRightPading
  86. */
  87. publicvoidsetClearImageRightPading(intclearImageRightPading){
  88. this.clearImageRightPading=clearImageRightPading;
  89. requestLayout();
  90. }
  91. /**
  92. *设置EditText的背景</br>Note</br>(1)调用了该方法之后,如果背景图是.9图的话,必须调用
  93. *{@link#setEditTextPadding(int,int,int,int)}方法</br>(2)此方法必须是调用了
  94. *{@link#setClearImageDrawableId(int)}之后才能调用
  95. *
  96. *@paramresid
  97. */
  98. publicvoidsetEditTextBackGround(intresid){
  99. editText.setBackgroundResource(resid);
  100. }
  101. publicvoidsetTextColor(intcolor){
  102. editText.setTextColor(color);
  103. }
  104. publicvoidsetTextColorSize(intsize){
  105. editText.setTextSize(size);
  106. }
  107. @Override
  108. protectedvoidonMeasure(intwidthMeasureSpec,intheightMeasureSpec){
  109. super.onMeasure(widthMeasureSpec,heightMeasureSpec);
  110. intwidth=MeasureSpec.getSize(widthMeasureSpec);
  111. //intheight=MeasureSpec.getSize(heightMeasureSpec);
  112. intchildCount=getChildCount();
  113. for(inti=0;i<childCount;i++){
  114. if(i==0){
  115. getChildAt(i).measure(MeasureSpec.makeMeasureSpec(getWidth(),MeasureSpec.EXACTLY),
  116. getDefaultSize(getSuggestedMinimumHeight(),heightMeasureSpec));
  117. }else{
  118. TextViewsecondView=(TextView)getChildAt(i);
  119. secondView.measure(MeasureSpec.makeMeasureSpec(secondView.getBackground().getIntrinsicWidth(),MeasureSpec.UNSPECIFIED),
  120. MeasureSpec.makeMeasureSpec(secondView.getBackground().getIntrinsicHeight(),MeasureSpec.UNSPECIFIED));
  121. }
  122. }
  123. setMeasuredDimension(width,getChildAt(0).getMeasuredHeight());
  124. }
  125. @Override
  126. protectedvoidonLayout(booleanchanged,intl,intt,intr,intb){
  127. finalEditTextfirstView=editText;
  128. finalViewsecondView=clearImage;
  129. finalinteditTextWith=firstView.getMeasuredWidth();
  130. finalintimageViewWidth=secondView.getMeasuredWidth();
  131. firstView.layout(0,0,editTextWith,firstView.getMeasuredHeight());
  132. finalinttop=(firstView.getMeasuredHeight()-secondView.getMeasuredHeight())>>1;
  133. secondView.layout(editTextWith-imageViewWidth-clearImageRightPading,top,editTextWith-clearImageRightPading,top
  134. +secondView.getMeasuredHeight());
  135. }
  136. @Override
  137. publicvoidonClick(Viewv){
  138. editText.setText("");
  139. }
  140. }


在xml布局很简单,如下:

[java] view plain copy
  1. <com.example.testandroid.ClearEditText
  2. android:id="@+id/myedit"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content">
  5. </com.example.testandroid.ClearEditText>


调用很很简单:

[java] view plain copy
  1. ClearEditTextclearEditText=(ClearEditText)getView().findViewById(R.id.myedit);
  2. clearEditText.setClearImageDrawableId(R.drawable.clear_edittext_selector);
  3. clearEditText.setEditTextBackGround(R.drawable.bg_tab_search_edit);
  4. clearEditText.setEditTextPadding(30,20,20,20);


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

更多相关文章

  1. android读取图片
  2. Android 使用Glide实现圆形和圆角图片
  3. 2012-7-20 android 图片叠加效果——两种方法
  4. Android右滑返回上一个界面的实现方法
  5. 系统关闭GPRS数据流量和 GPS的方法
  6. Android添加半透明操作提示的方法

随机推荐

  1. Android平台上的Gphone 图像演示
  2. Android创建快捷方式(shortcut)
  3. android唤醒屏幕/保持屏幕唤醒
  4. Android(安卓)Q AppCompactor and LowMem
  5. android 下的webview 设置多点触控放大
  6. Android(安卓)SeekBar
  7. android 选择图片(从手机照相机或手机图
  8. android activity 设置为单点触摸
  9. Android(安卓)ListView滑动加载
  10. RN 打包流程