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()
    在绘制控件时候调用,控件具体长什么样子就在此方法中实现


    这些方法的调用顺序是:

    一个控件从创建到显示到屏幕:

    onLayout  ->  onMeasure  ->  onLayout  ->  onDraw

    之后,(Button为例)点击Button,都会调用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>
    MainActivity
    人生就是一局不能Again的DOTA
  • 相关阅读:
    java包装类的缓存机制(转)
    分布式事务的思考(转)
    分布式事务框架介绍与使用案例
    java 内部类、匿名内部类
    spring cloud应用
    Oralce学习笔记(六)
    部署CentOS虚拟机集群
    商品详情页系统架构
    Oracle学习笔记(五)
    hystrix完成对redis访问的资源隔离
  • 原文地址:https://www.cnblogs.com/hellenism/p/3672351.html
Copyright © 2011-2022 走看看