xml中控件调用构造方法

系统控件view有三个构造方法,分别如下

public DrawView(Context context) {
        super(context);

    }

    public DrawView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

    }

    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

关于构造方法,网上给的解释是

如果在Code中实例化一个View会调用第一个构造函数,如果在xml中定义会调用第二个构造函数,而第三个函数系统是不调用的,要由 View(我们自定义的或系统预定义的View,如此处的CustomTextView和Button)显式调用,比如在这里我们在第二个构造函数中调用 了第三个构造函数,并将R.attr.CustomizeStyle传给了第三个参数。第三个参数的意义就如同它的名字所说的,是默认的Style,只是这里没有说清楚,这里的默认的Style是指它在当前Application或Activity所用的Theme中的默认Style。

至于只有一个参数的方法,我们主要是在new一个view的时候,会使用。它的那个参数是上下文环境。如

Button button = new Button(this);

至于两个参数跟三个参数的方法调用情况,网上有说是跟你在xml中是否使用了style有关。不过,我验证了下,无论有无style,都仅仅是调用两个参数的构造方法。验证如下

自定义style

package com.example.testcode;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

public class DrawView extends View {

    public DrawView(Context context) {
        super(context);

    }

    public DrawView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

    }

    public DrawView(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub

        //这两个方法必须有一个,否则会报错
        //super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(200, 200);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right,
            int bottom) {
        // TODO Auto-generated method stub
        Log.e("123", "change===" + changed + " left===" + left + " top==="
                + top + " right===" + right + " bottom===" + bottom);
        super.onLayout(changed, left, top, right, bottom);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        Log.e("123", "onDraw");
        super.onDraw(canvas);
    }
}

xml中的使用

1.当没有style的时候

<RelativeLayout 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"
    tools:context="com.example.testcode.MainActivity" >

    <com.example.testcode.DrawView
        android:layout_width="100dp"
        android:layout_height="100dp"
        />

</RelativeLayout>

打印结果

09-29 11:28:13.445: E/123(6555): drawview_2

2.当有style的时候

<RelativeLayout 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"
    tools:context="com.example.testcode.MainActivity" >

    <com.example.testcode.DrawView
        style="@style/test"
        />

</RelativeLayout>

style

<style name="test">
        <item name="android:layout_width">100dp</item>
        <item name="android:layout_height">100dp</item>
        <item name="android:background">#ff0000</item>
    </style>

打印结果

09-29 11:28:13.445: E/123(6555): drawview_2

所以,xml中的控件,只调用两个参数的方法。而三个参数的方法,其实是在二个参数的方法中显式调用的。我们可以看下Button源码

public class Button extends TextView {
    public Button(Context context) {
        this(context, null);
    }   

    public Button(Context context, AttributeSet attrs) {
        this(context, attrs, com.android.internal.R.attr.buttonStyle);
    }   

    public Button(Context context, AttributeSet attrs, int defStyleAttr) {
        this(context, attrs, defStyleAttr, 0);
    }   

    public Button(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }   

    @Override
    public void onInitializeAccessibilityEvent(AccessibilityEvent event) {
        super.onInitializeAccessibilityEvent(event);
        event.setClassName(Button.class.getName());
    }   

    @Override
    public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {
        super.onInitializeAccessibilityNodeInfo(info);
        info.setClassName(Button.class.getName());
    }
}

从上面我们很清除的看到了这几个构造方法的调用关系

1.1参数->2参数(没有传入属性)->3参数(传入了系统默认的style)->4参数

现在我们来看下四个参数的构造方法最后两个参数的意义

时间: 2024-10-08 06:44:48

xml中控件调用构造方法的相关文章

Layout.xml中控件的ID命名方式

控件 缩写 LayoutView lv RelativeView rv TextView tv Button btn ImageButton imgBtn ImageView mgView 或则 iv CheckBox chk RadioButton rdoBtn analogClock anaClk DigtalClock dgtClk DatePicker dtPk EditText edtTxt TimePicker tmPk toggleButton tglBtn ProgressBar

设置xml中控件的圆润边框效果

1 <?xml version="1.0" encoding="utf-8"?> 2 3 <shape xmlns:android="http://schemas.android.com/apk/res/android"> 4 5 <!-- 背景填充颜色值 --> 6 7 8 <solid android:color="#FFA500"/> 9 10 <!-- radius

duilib中控件拖拽功能的实现方法(附源码)

转载请说明原出处,谢谢~~:http://blog.csdn.net/zhuhongshu/article/details/41144283 duilib库中原本没有显示的对控件增加拖拽的功能,而实际使用过程中拖拽功能也是有用武之地的.看群里有人问题duilib怎么支持拖拽,我也就写这篇文章说明一下duilib实现控件拖拽的方法. 当我刚接触duilib不就的时候,考虑过duilib拖拽这个功能,当时的想法是,在xml布局中设置一个浮动的控件,正常状态下他是隐藏的,当出发了拖拽条件后将他显示并且

JNI/NDK开发指南(八)——调用构造方法和父类实例方法

转载请注明出处:http://blog.csdn.net/xyang81/article/details/44002089 在第6章我们学习到了在Native层如何调用Java静态方法和实例方法,其中调用实例方法的示例代码中也提到了调用构造函数来实始化一个对象,但没有详细介绍,一带而过了.还没有阅读过的同学请移步<JNI/NDK开发指南(六)--C/C++访问Java实例方法和静态方法>阅读.这章详细来介绍下初始一个对象的两种方式,以及如何调用子类对象重写的父类实例方法. 我们先回过一下,在J

问题解决——MFC SDI程序 CFormView中控件随窗口缩放

从来都是做对话框程序,这次想做个SDI的程序,想着用一下带Robbin界面的office2007风格,就不用使用那些花钱的商业控件/UI库了. 如果你不想看我打的文字,可以直接拷走代码,自己声明上定义再略作修改就可以用了,不需做任何修改. -------------------------------小尾巴首次登场----------------------------------- SDI程序,是要缩放的,如果是往里输入文字的话,这倒没什么,但是这次我使用的是CFormView类,里面加了控件

C#中使用多线程访问Winform中控件的若干问题

我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Thread thread = new Thread(Thread

Android中控件的宽高

1.在一个Relatitivelayout布局里用代码add一个独立的button布局,结果该button的宽高无效 则说明:Android中控件默认是没有宽高的,只有五大布局才能给其宽高,即在代码中要设置控件的宽高需要使用福控件的layoutparams 命名规则:layout_width 想通的:layout_gravity和gravity 2.直接在activity中setContentView里引用最外层为button的布局,则也有宽高 原因:android默认在最外层给添加了Frame

使用脚本操作UpdatePanel中控件的问题

假设有一个脚本(用js或者jQuery等类似手段编写),为UpdatePanel中的一个普通的TextBox赋值.如果你以为这样写: <head runat="server">     <title>Test</title>     <script src="Scripts/jquery-2.0.0.js"></script>     <script>         $(function ()

设置项目中控件的样式:webconfig中system.web下的Pages节点

关于system.web下面的Pages节点的详细说明,MSDN上面有,看这里. 这个Pages节点下的theme属性可以设置项目中控件的样式,直接引用skin文件来设置样式,不用在每个页面中添加,可以保证页面风格的一致性: <pages theme= "defaultTheme" /> 关于theme的添加: 创建主题完毕之后,在App_Themes文件夹下创建自己的样式,pages里面就可以直接使用了. 当然,如果要在某个页面中添加自定义的样式,可以在aspx中指定pa