zoukankan      html  css  js  c++  java
  • Android中自定义控件,三个构造函数

    自定义控件时,最好抽象得彻底,并且编写需严谨,因为可能程序中多处都会引用到它,或者提供给团队中的其他人使用。  

    其一般步骤为:

    1.创建控件的类文件,定义其功能逻辑。一般继承自现有控件或者View   

    2.在res/values目录下创建attrs.xml文件,用于定义该控件的xml标签属性,方便在使用xml声明该控件时设置参数    

    3.实现该控件的构造器,在构造器中把xml标签属性与后台代码中的变量相连接   

    4.完成以上步骤之后,便可使用该控件  


    需要注意的地方:  

    一.View的三个构造函数       

    第一个构造函数:     当不需要使用xml声明或者不需要使用inflate动态加载时候,实现此构造函数即可  

    第二个构造函数:     当需要在xml中声明此控件,则需要实现此构造函数。并且在构造函数中把自定义的属性与控件的数据成员连接起来。  

    第三个构造函数:     接受一个style资源  

    二.View重要的回调  

      

    onFinishInflate()     在此控件被通过xml声明的方式创建之后调用  

    onMeasure(in,int)     计算本控件的宽高,如果继承自原有控件,则一般不需要重写此方法  

    onLayout()     用于布局控件,对于不是继承ViewGroup的控件,一般不需要重写此方法  

    onDraw()     在绘制控件时候调用,控件具体长什么样子就在此方法中实现  

    三.设置自定义属性  

    使用自定义控件时候,需要通过把xml中声明的属性与控件的数据成员连接起来  

    在res/values目录下创建attrs.xml文件  

    定义属性组  

    在构造函数中获取这些值  


    Example:  

    1.myButton.java  

          
    public class myButton extends Button
    {
      private int step;
      
      public myButton(Context context, AttributeSet attrs, int defStyle)
      {
        super(context, attrs, defStyle);
        // TODO Auto-generated constructor stub
        init(attrs);
      }
    
      public myButton(Context context, AttributeSet attrs)
      {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        init(attrs);
      }
    
      public myButton(Context context)
      {
        super(context);
        // TODO Auto-generated constructor stub
      }
      
      private void init(AttributeSet attrs)
      {
        if (attrs != null)
        {
          TypedArray a = getContext().obtainStyledAttributes(attrs,
              R.styleable.myButton);
          
           step = a.getInt(R.styleable.myButton_step, 0);
           
           a.recycle();
           
           this.setText(step+"");
        }
      }
    }
    myButton.java  

    2.attrs.xml

          
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="myButton">
            <attr name="step" format="integer"/>
        </declare-styleable>
    </resources>
    attrs.xml  

    3.使用自定义控件

    xmlns:views="http://schemas.android.com/apk/res/" + 子包名

          
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:paddingBottom="@dimen/activity_vertical_margin"
      android:paddingLeft="@dimen/activity_horizontal_margin"
      android:paddingRight="@dimen/activity_horizontal_margin"
      android:paddingTop="@dimen/activity_vertical_margin"
      android:orientation="vertical"
      tools:context=".MainActivity" 
      
      xmlns:views="http://schemas.android.com/apk/res/com.example.createvewtest">
    
      <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />
      
      <com.example.views.myButton 
        android:id="@+id/btn"
        android:text="button"
        views:step="10"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    
    </LinearLayout>
  • 相关阅读:
    第一次 实习笔记
    docker 提示 Drive has not been shared 错误
    使用matplotlib画出log的图像
    python基础实现tcp文件传输
    django简单实现注册登录模块
    python使用消息队列RabbitMq(进阶)
    scrapy爬虫值Items
    redis常见配置redis.conf
    js实现往数组中添加非存在的对象,如果存在就改变键值。
    CSS之user-select——设置标签中的文字是否可被复制
  • 原文地址:https://www.cnblogs.com/liuguanghai/p/3957330.html
Copyright © 2011-2022 走看看