zoukankan      html  css  js  c++  java
  • 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);
  • 相关阅读:
    *Integer to English Words
    *Palindrome Linked List
    *Partition List
    Sort Colors
    wireshark tls
    find 路径必须在表达式之前
    http://mozilla.debian.net/
    maven bundle
    xmpp
    xmlns=""
  • 原文地址:https://www.cnblogs.com/windamy/p/3924111.html
Copyright © 2011-2022 走看看