Android自定义组件简单实例(自定义属性)

有如下一个组件:
      最外有一个LinearLayout,包含左边的一个TextView和一个右边的EditText。

在你的APP的使用场景较多,为方便使用,决定自定义此组件,并设定相关xml属性,方便设置。
Android自定义组件简单实例(自定义属性)_第1张图片
step1:
定义 MyComponent 继承至LinearLayout,添加构造方法、左侧和右侧view的相关属性。

public class MyComponent extends LinearLayout {
     
     //左边
      private String txtLeft;
      //右边
      private String txtRightHint;

     @SuppressLint("NewApi")
     public MyComponent(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            // TODO Auto-generated constructor stub
     }

     public MyComponent(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
            // TODO Auto-generated constructor stub
     }

      public MyComponent(Context context) {
            this(context, null);
            // TODO Auto-generated constructor stub
     }        

}

在这三个构造方法中,第二个方法必须,不然会 inflate xml 报错。为了防止错误,使用 this 互相调用,避免出错。待会我们在三个参数的构造方法操作。

step2 :
在res/values下建立resource文件,定义attr属性



    
        
        
       
        
        
    

step3:
在xml文件中,使用定义的组件,设置相关属性,别忘了加上命名空间,不然会报错。

   
    
    

    
       
    
  


step 4:
完善 MyComponent构造方法:
public class MyComponent extends LinearLayout {
     
      //左边
      private String txtLeft;
      //右边
      private String txtRightHint;
     
      private TextView tv;
      private EditText et;
     

      @SuppressLint( "NewApi")
      public MyComponent(Context context, AttributeSet attrs, int defStyle) {
           
            super(context, attrs, defStyle);
           
            //获得对属性集的引用,然后就可以用"ta"的各种方法来获取相应的属性值了
           TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.MyComponent );
            this. txtLeft = ta.getString(R.styleable.MyComponent_txtLeft );
            this. txtRightHint = ta.getString(R.styleable.MyComponent_txtRightHint );
           
            //设置最外层的LinearLayout
           setLayoutParams( new LinearLayout.LayoutParams(426, 66));
           setOrientation( HORIZONTAL);
           setGravity(Gravity. CENTER_VERTICAL);
           setAddStatesFromChildren( true);
           setBackgroundResource(R.drawable. bg_et_focus);
           
            //TextView
            tv = new TextView(context);
            //设置大小
            tv.setLayoutParams( new LayoutParams(120, 66));
            tv.setText( txtLeft);
            tv.setTextSize(22);
            //设置位置
            tv.setGravity(Gravity. CENTER_VERTICAL | Gravity.RIGHT );
           addView( tv);
           
            //EditText
            et = new EditText(context);
            et.setPadding(10, 0, 0, 0);
            et.setLayoutParams( new LayoutParams(266, 66));
            et.setHint( txtRightHint);
            et.setTextSize(22);
            et.setGravity(Gravity. CENTER_VERTICAL);
           addView( et);
           
            //回收资源
           ta.recycle();
     }

      public MyComponent(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
            // TODO Auto-generated constructor stub
     }

      public MyComponent(Context context) {
            this(context, null);
            // TODO Auto-generated constructor stub
     }    

}

结果:
Android自定义组件简单实例(自定义属性)_第2张图片
效果看起来还不错吧。


整个自定义组件的过程就是概括为在attrs中设置属性名字,在xml中加上命名空间,为自定义属性赋值。同时在代码中,通过obtainStyledAttributes获取相应的在xml中赋的值。

你可能感兴趣的:(Android自定义view)