Android 实现自定义属性 declare-styleable扩展 方法 &Eclipse/AndroidStudio xml 工具空间声明注意点

Android 实现自定义属性 declare-styleable扩展 方法 &Eclipse/AndroidStudio xml 工具空间声明注意点


自定义控件实现EditText输入 一键删除功能

参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0808/1643.html

实现步骤:

  • 1、 自定义LineEdittext 继承 EditText类
  • 2、 添加扩展属性 设置drawable left right Image图标
  • 3、 添加焦点监听接口、添加Edittext输入字符监听 onTounchEvent 重写
      import android.content.Context;
      import android.content.res.TypedArray;
      import android.graphics.Canvas;
      import android.graphics.Rect;
      import android.graphics.drawable.Drawable;
      import android.support.annotation.ColorRes;
      import android.support.annotation.DrawableRes;
      import android.support.annotation.IntegerRes;
      import android.text.Editable;
      import android.text.InputFilter;
      import android.text.InputType;
      import android.text.TextUtils;
      import android.text.TextWatcher;
      import android.text.method.PasswordTransformationMethod;
      import android.util.AttributeSet;
      import android.util.Log;
      import android.view.MotionEvent;
      import android.view.View;
      import android.widget.EditText;

      import ejiang.teacher.R;
      import ejiang.teacher.common.DisplayUtils;

      /**
      * Created by ejiang on 2017-03-31.
      *
      * @author Mr.Zang
      */

      public class LineEditText extends EditText implements TextWatcher,
           View.OnFocusChangeListener {

       private int color;
       private int status = 2;

       private Context mContext;
       /**
        * 是否获取焦点,默认没有焦点
        */
       private boolean hasFocus = false;
       /**
        * 手指抬起时的X坐标
        */
       private int xUp = 0;

       /*header--UnSelecte--*/
       private Drawable mLeftHender;
       /*header--Selecte*/
       private Drawable mLeftHenderSelete;
       /*belecte--Infromation_btn*/
       private Drawable del_btn;

       /*textsize*/
       @IntegerRes
       private int textsize;
       /*textcolor*/
       @ColorRes
       private int textColor;
       /*textHintColor*/
       @ColorRes
       private int textHintColor;

       @DrawableRes
       @ColorRes
       private int viewBackGround = R.drawable.bg_edittext;  //背景颜色
       @DrawableRes
       private int userHeaderUn = R.drawable.login_user;
       @DrawableRes
       private int userHeaderSel = R.drawable.login_user_seletor;




       public LineEditText(Context context, AttributeSet attrs) {
           super(context, attrs);
           mContext = context;
           init(attrs);
       }

       /**
        * 设置userHender图标
        *
        * @param userHender       --未选中or未获得焦点的Hender图标
        * @param userHenderSelect
        */
       public void setUserHender(@DrawableRes int userHender, @DrawableRes int userHenderSelect) {

           if (mContext != null) {
               this.mLeftHender = getLocalDrawbleRes(userHender);
               this.mLeftHenderSelete = getLocalDrawbleRes(userHenderSelect);
           }

       }

       private void init(AttributeSet attrs) {
           if (mContext != null && attrs != null) {
               TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.LineEditText);
               viewBackGround = a.getResourceId(R.styleable.LineEditText_editBackground, viewBackGround);
               userHeaderUn = a.getResourceId(R.styleable.LineEditText_userHeaderUn, userHeaderUn);
               userHeaderSel = a.getResourceId(R.styleable.LineEditText_userHenderSel, userHeaderSel);
               a.recycle();
           }


           //设置背景颜色 --样式
           setBackgroundResource(viewBackGround);
           /*设置删除按钮样式*/
           del_btn = mContext.getResources().getDrawable(R.drawable.login_delete);

           /*userHendler图标*/
           mLeftHender = getLocalDrawbleRes(userHeaderUn);
           mLeftHenderSelete = getLocalDrawbleRes(userHeaderSel);
           mLeftHender.setBounds(0, 0, mLeftHender.getMinimumWidth(), mLeftHender.getMinimumHeight());
           setCompoundDrawablesWithIntrinsicBounds(mLeftHender, null, null, null); //设置user图标

      //        setInputType(InputType.TYPE_CLASS_NUMBER); //设置输入模式 --数字
      //        setTransformationMethod(PasswordTransformationMethod.getInstance()); //设置输入不可见
      //        setFilters(new InputFilter[]{new InputFilter.LengthFilter(6)}); //设置可输入的字符长度

      //        setHint(R.string.login_password); //设置hint提示
      //        setHintTextColor(mContext.getResources().getColor(R.color.color_no_year_book)); //设置hint颜色
      //        setTextSize(DisplayUtils.Px2Sp(mContext, 32)); //设置字体大小
      //        setCompoundDrawablePadding(DisplayUtils.Dp2Px(mContext, 10)); //设置Padding
           addListeners(); //设置监听
       }

       @Override
       protected void onDraw(Canvas canvas) {
           super.onDraw(canvas);
       }


       /**
        * 获取本地Drawble对象
        *
        * @param drawableRes
        * @return
        */
       private Drawable getLocalDrawbleRes(@DrawableRes int drawableRes) {
           return mContext.getResources().getDrawable(drawableRes);
       }


       // 处理删除事件
       @Override
       public boolean onTouchEvent(MotionEvent event) {
           if (del_btn != null && event.getAction() == MotionEvent.ACTION_UP) {
               // 获取点击时手指抬起的X坐标
               xUp = (int) event.getX();
               Log.e("xUp", xUp + "");
               /*Rect rect = new Rect();
               getGlobalVisibleRect(rect);
               rect.left = rect.right - 50;*/
               // 当点击的坐标到当前输入框右侧的距离小于等于getCompoundPaddingRight()的距离时,则认为是点击了删除图标
               if ((getWidth() - xUp) <= getCompoundPaddingRight()) {
                   if (!TextUtils.isEmpty(getText().toString())) {
                       setText("");
                   }
               }
           }
           return super.onTouchEvent(event);
       }


       /**
        * 添加监听回调
        */
       private void addListeners() {
           try {
               setOnFocusChangeListener(this);
               addTextChangedListener(this);
           } catch (Exception e) {
               e.printStackTrace();
           }
       }


       /**
        * 改变焦点监听
        *
        * @param focused
        * @param direction
        * @param previouslyFocusedRect
        */
       @Override
       protected void onFocusChanged(boolean focused, int direction,
                                     Rect previouslyFocusedRect) {
           super.onFocusChanged(focused, direction, previouslyFocusedRect);
           this.hasFocus = focused;
           if (focused) {
               setCompoundDrawablesWithIntrinsicBounds(mLeftHenderSelete, null, null, null);
               postInvalidate();
           } else {

           }

       }

       @Override
       protected void finalize() throws Throwable {
           super.finalize();
       }

       /**
        * 设置文字颜色
        *
        * @param color
        */
       public void setColor(int color) {
           this.color = color;
           this.setTextColor(color);
           invalidate();
       }


       //TextWatcher
       @Override
       public void afterTextChanged(Editable arg0) {
           postInvalidate();
       }

       @Override
       public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                                     int arg3) {
           if (TextUtils.isEmpty(arg0)) {
               // 如果为空,则不显示删除图标
               setCompoundDrawablesWithIntrinsicBounds(mLeftHender, null, null, null);
           } else {
               // 如果非空,则要显示删除图标
               setCompoundDrawablesWithIntrinsicBounds(mLeftHenderSelete, null, del_btn, null);
           }
       }

       @Override
       public void onTextChanged(CharSequence s, int start, int before, int after) {
           if (hasFocus) {
               if (TextUtils.isEmpty(s)) {
                   // 如果为空,则不显示删除图标
                   setCompoundDrawablesWithIntrinsicBounds(mLeftHender, null, null, null);
               } else {
                   // 如果非空,则要显示删除图标
                   setCompoundDrawablesWithIntrinsicBounds(mLeftHenderSelete, null, del_btn, null);
               }
           }
       }


       //View.onFocusChangeListener
       @Override
       public void onFocusChange(View arg0, boolean arg1) {
           try {
               this.hasFocus = arg1;
           } catch (Exception e) {
               e.printStackTrace();
           }
       }

      }

declare-styleable 设置 res/value/attrs.xml

<declare-styleable name="LineEditText">
  <attr name="editBackground" format="reference"/>
  <attr name="userHeaderUn" format="reference"/>
  <attr name="userHenderSel" format="reference"/>
  <attr name="delteInformation" format="reference"/>
  <attr name="edithint" format="string|reference"/>
  <attr name="edithintColor" format="integer|reference"/>
</declare-styleable>

xml 根布局命名:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容