首页 > 代码库 > LayoutInflater作用及使用--自定义EditText,自带清除内容按钮

LayoutInflater作用及使用--自定义EditText,自带清除内容按钮

作用: 
1、对于一个没有被载入或者想要动态载入的界面, 都需要使用inflate来载入. 

2、对于一个已经载入的Activity, 就可以使用实现了这个Activiyt的的findViewById方法来获得其中的界面元素. 

 


 

举例:定义了一个控件类CleanableEditText,实现在焦点变化时和输入内容发生变化时均要判断是否显示右边clean图标

     后台调用自定义控件的时候需要LayoutInflater来载入(见第三段代码)。

自定义控件:

package com.utils;  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.widget.EditText; /**  * 在焦点变化时和输入内容发生变化时均要判断是否显示右边clean图标  */public class CleanableEditText extends EditText {     private Drawable mRightDrawable;     private boolean isHasFocus;     public CleanableEditText(Context context) {         super(context);         init();     }     public CleanableEditText(Context context, AttributeSet attrs) {         super(context, attrs);         init();     }       public CleanableEditText(Context context, AttributeSet attrs, int defStyle) {         super(context, attrs, defStyle);         init();     }           private void init(){         //getCompoundDrawables:         //Returns drawables for the left, top, right, and bottom borders.         Drawable [] drawables=this.getCompoundDrawables();         //取得right位置的Drawable         //即我们在布局文件中设置的android:drawableRight         mRightDrawable=drawables[2];           //设置焦点变化的监听         this.setOnFocusChangeListener(new FocusChangeListenerImpl());         //设置EditText文字变化的监听         this.addTextChangedListener(new TextWatcherImpl());         //初始化时让右边clean图标不可见         setClearDrawableVisible(false);     }                 /**      * 当手指抬起的位置在clean的图标的区域      * 我们将此视为进行清除操作      * getWidth():得到控件的宽度      * event.getX():抬起时的坐标(改坐标是相对于控件本身而言的)      * getTotalPaddingRight():clean的图标左边缘至控件右边缘的距离      * getPaddingRight():clean的图标右边缘至控件右边缘的距离      * 于是:      * getWidth() - getTotalPaddingRight()表示:      * 控件左边到clean的图标左边缘的区域      * getWidth() - getPaddingRight()表示:      * 控件左边到clean的图标右边缘的区域      * 所以这两者之间的区域刚好是clean的图标的区域      */    @Override    public boolean onTouchEvent(MotionEvent event) {         switch (event.getAction()) {         case MotionEvent.ACTION_UP:                           boolean isClean =(event.getX() > (getWidth() - getTotalPaddingRight()))&&                              (event.getX() < (getWidth() - getPaddingRight()));             if (isClean) {                 setText("");             }             break;           default:             break;         }         return super.onTouchEvent(event);     }           private class FocusChangeListenerImpl implements OnFocusChangeListener{         @Override        public void onFocusChange(View v, boolean hasFocus) {              isHasFocus=hasFocus;              if (isHasFocus) {                  boolean isVisible=getText().toString().length()>=1;                  setClearDrawableVisible(isVisible);             } else {                  setClearDrawableVisible(false);             }         }               }           //当输入结束后判断是否显示右边clean的图标     private class TextWatcherImpl implements TextWatcher{         @Override        public void afterTextChanged(Editable s) {              boolean isVisible=getText().toString().length()>=1;              setClearDrawableVisible(isVisible);         }           @Override        public void beforeTextChanged(CharSequence s, int start, int count,int after) {                       }           @Override        public void onTextChanged(CharSequence s, int start, int before,int count) {                       }               }              //隐藏或者显示右边clean的图标     protected void setClearDrawableVisible(boolean isVisible) {         Drawable rightDrawable;         if (isVisible) {             rightDrawable = mRightDrawable;         } else {             rightDrawable = null;         }         //使用代码设置该控件left, top, right, and bottom处的图标         setCompoundDrawables(getCompoundDrawables()[0],getCompoundDrawables()[1],                               rightDrawable,getCompoundDrawables()[3]);     }      }

 

调用xml

<com.utils.CleanableEditText            android:id="@+id/login_name"            android:layout_width="match_parent"            android:layout_height="@dimen/logineditview_hight"            android:layout_marginLeft="16dp"            android:hint="@string/user_name"            android:layout_toRightOf="@id/img_login_name"            android:background="@null"            android:singleLine="true"            android:imeOptions="actionNext"            android:drawableRight="@drawable/clean"            />

后台调用:

final View getView = LayoutInflater.from(this.getContext()).inflate(R.layout.login, null);        ed_loginCode = (CleanableEditText) getView.findViewById(R.id.login_name);