您的位置:首页 > 移动开发 > Android开发

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

2014-05-27 11:53 155 查看
笔者接触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,
属性定义

<span style="white-space:pre">	</span><declare-styleable name="名称">
<span style="white-space:pre">		</span><attr name="orientation">
<span style="white-space:pre">		</span><enum name="horizontal" value="0" />
<span style="white-space:pre">		</span><enum name="vertical" value="1" />
<span style="white-space:pre">		</span></attr>
<span style="white-space:pre">	</span></declare-styleable>
b,

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

10,flag:位或运算。

a,
属性定义

<span style="white-space:pre">	</span><declare-styleable name="名称">
<span style="white-space:pre">		</span><attr name="windowSoftInputMode">
<span style="white-space:pre">		</span><flag name="stateUnspecified" value="0" />
<span style="white-space:pre">		</span><flag name="stateUnchanged" value="1" />
<span style="white-space:pre">		</span><flag name="stateHidden" value="2" />
<span style="white-space:pre">		</span><flag name="stateAlwaysHidden" value="3" />
<span style="white-space:pre">		</span><flag name="stateVisible" value="4" />
<span style="white-space:pre">		</span><flag name="stateAlwaysVisible" value="5" />
<span style="white-space:pre">		</span><flag name="adjustUnspecified" value="0x00" />
<span style="white-space:pre">		</span><flag name="adjustResize" value="0x10" />
<span style="white-space:pre">		</span><flag name="adjustPan" value="0x20" />
<span style="white-space:pre">		</span><flag name="adjustNothing" value="0x30" />
<span style="white-space:pre">		</span></attr>
<span style="white-space:pre">	</span></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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  自定义控件 Android