Android自定义控件 于笔者-开天辟地的大事(一)

笔者接触Android也有2年有余,在两年中,一直逃避自定义控件,认为自定义控件太难了,今天不知怎么回事,告诉自己,一定要迎难而上,这样才能所向披靡。下面是我对自定义控件的见解

今天,笔者先对自定义控件中,自定义属性进行部分讲解:

众所周知,在Android中,屏幕适配的优势在于它强大的XML。但是XML中有一个神奇的功能,当你按下ALT+/的时候,eclipse会给你提示,想设置什么控件的属性,很容易,当你的XML写完后,你的View已经布局完成,呈献给用户了。下面,我们就用自定义的一个View来刨析一下这个神奇的功能。

首先,我们在value下面的resource下面,定义一下代码

 

<declare-styleable name="blankView">
        <attr name="blankImg" format="reference" />
        <attr name="blankTxt" format="reference" />
</declare-styleable>

 

这里面定义的blankImg, blankTxt 是自定义的属性,在我们自定义的View中会用到,暂时先不详解

ps:此处备注一下format可能的取值 :

1,reference:参考某一资源ID。

2,color:颜色值。

3,boolean:布尔值。

4,dimension:尺寸值。

5,float:浮点值。

6,integer:整型值。

7,string:字符串。

8,fraction:百分数。

9,enum:枚举值。

a, 属性定义

 

<declare-styleable name="名称">  
    <attr name="orientation">  
        <enum name="horizontal" value="0" />  
        <enum name="vertical" value="1" />  
    </attr>  
</declare-styleable> 

b, 属性使用:这么简单地东西,不在写使用方法

 

10,flag:位或运算。

a, 属性定义

 

<declare-styleable name="名称">  
    <attr name="windowSoftInputMode">  
        <flag name="stateUnspecified" value="0" />  
        <flag name="stateUnchanged" value="1" />  
        <flag name="stateHidden" value="2" />  
        <flag name="stateAlwaysHidden" value="3" />  
        <flag name="stateVisible" value="4" />  
        <flag name="stateAlwaysVisible" value="5" />  
        <flag name="adjustUnspecified" value="0x00" />  
        <flag name="adjustResize" value="0x10" />  
        <flag name="adjustPan" value="0x20" />  
        <flag name="adjustNothing" value="0x30" />  
    </attr>  
</declare-styleable>  

b,使用方法,自己去搞吧。天高任鸟飞,海阔凭鱼跃
 

 

下面,我们在XML中用到控件BlankView他是继承于View

这是我们的命名空间dajia:

 

xmlns:dajia="http://schemas.android.com/apk/res/com.dajia.view"

 

 

 

 

<com.dajia.view.view.BlankView
    android:id="@+id/blankView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    dajia:blankImg="@drawable/icon_have_deleted"
    dajia:blankTxt="@string/file_have_deleted"
    android:visibility="gone" />

 

 

各位,这样完成之后,不要庆幸太早,这样我们的View和这些自定义的View一点关系都没有。我始终认为有一句至理名言:

凡事有因有果,知其因,必求其果。
 

现在我们,把View和我们自定义的属性结合起来:

 

package com.dajia.view.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.dajia.view.R;

public class BlankView extends RelativeLayout {
	private ImageView mBlankIV;
	private TextView mBlankTV;

	public BlankView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		inflate(getContext(), R.layout.view_blank, this);
		mBlankIV = (ImageView) findViewById(R.id.blankIV);
		mBlankTV = (TextView) findViewById(R.id.blankTV);
		if (attrs != null) {
			TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.blankView);//这里面是我们在View的XML中设置的属性,跟我们自定义的属性对应
			if (a.hasValue(R.styleable.blankView_blankImg)) {
				Drawable d = a.getDrawable(R.styleable.blankView_blankImg);//取出blankView_blankImg设置给我们View的ImageView
				if (d != null) {
					mBlankIV.setImageDrawable(d);
				}
			}
			if (a.hasValue(R.styleable.blankView_blankTxt)) {
				mBlankTV.setText(a.getText(R.styleable.blankView_blankTxt));<span style="font-family: Arial, Helvetica, sans-serif;">//取出blankView_blankTxt设置给我们View的TextView</span>

			}
			a.recycle();
		}
	}

	public BlankView(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public BlankView(Context context) {
		this(context, null, 0);
	}

	public void setBlankImage(int resId) {
		mBlankIV.setImageResource(resId);
	}

	public void setBlankText(int resId) {
		mBlankTV.setText(resId);
	}

}

到这里,我们的第一篇已经讲完了,不知道各位理解的怎么样,有问题QQ我。

 

QQ:120595960
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值