笔者接触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