说明:下面的例子使用了AndroidAnnotation,并非标准的开发模式,但是几行重要代码都是相同的。 这个例子是一个按钮,外层是LinearLayout,垂直布局,里面是一个ImageView,一个TextView,需要添加自定义的属性,以支持在Xml中写入ImageView的图片和TextView的文字。 先声明属性: `添加values/attrs.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MainTabButton">
<attr name="src" format="reference"></attr>
<attr name="text" format="string|reference"></attr>
</declare-styleable>
</resources>
声明了两个属性,一个src,限制值为引用,一个text,限制值为字符串或引用. format其他可能的值: reference:引用其他资源 color:颜色 boolean:布尔 dimension:尺寸 float:浮点 integer:整数 string:字符串 fraction:百分比 enum:枚举,用法:
<attr name="language">
<enum name="English" value="1"/>
</attr>
flag:位或运算,用法
<attr name="windowSoftInputMode">
<flag name="stateUnspecified" value="1" />
<flag name = "adjustNothing" value = "0x30" />
</attr>
<activity android:windowSoftInputMode="stateUnspecified | adjustNothing">
添加完属性后,写相应的类: MainTabButton.java:
package com.pocketdigi.components;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.googlecode.androidannotations.annotations.AfterViews;
import com.googlecode.androidannotations.annotations.EViewGroup;
import com.googlecode.androidannotations.annotations.ViewById;
import com.pocketdigi.dayday.R;
@EViewGroup(R.layout.component_button)
public class MainTabButton extends LinearLayout {
@ViewById
ImageView imageView;
@ViewById
TextView textView;
int imageId;
String text;
public MainTabButton(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.MainTabButton);
//读取XML中设置的属性值
imageId=a.getResourceId(R.styleable.MainTabButton_src, R.drawable.tab_radio_channel_normal);
text=a.getString(R.styleable.MainTabButton_text);
a.recycle();
}
//视图载入后,再设置两个控件
@AfterViews
public void afterViews()
{
setImage(imageId);
setText(text);
}
public void setImage(int resId) {
imageView.setImageResource(resId);
}
public void setText(String text) {
textView.setText(text);
}
//选中方法,如果选中,显示另一张图片,并改变文字颜色
public void selected(boolean isSelected)
{
if(isSelected)
{
switch(imageId)
{
case R.drawable.tab_radio_home_normal:
setImage(R.drawable.tab_radio_home_selected);
textView.setTextColor(getResources().getColor(R.color.tab_text_selected));
break;
case R.drawable.tab_radio_channel_normal:
setImage(R.drawable.tab_radio_channel_selected);
textView.setTextColor(getResources().getColor(R.color.tab_text_selected));
break;
case R.drawable.tab_radio_download_normal:
setImage(R.drawable.tab_radio_download_selected);
textView.setTextColor(getResources().getColor(R.color.tab_text_selected));
break;
case R.drawable.tab_radio_search_normal:
setImage(R.drawable.tab_radio_search_selected);
textView.setTextColor(getResources().getColor(R.color.tab_text_selected));
break;
case R.drawable.tab_radio_setting_normal:
setImage(R.drawable.tab_radio_setting_selected);
textView.setTextColor(getResources().getColor(R.color.tab_text_selected_blue));
break;
}
}
}
}
XML中使用:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:dayday="http://schemas.android.com/apk/res/com.pocketdigi.dayday"
android:layout_width="fill_parent"
android:layout_height="50dp"
android:layout_gravity="center"
android:background="@drawable/tab_bg"
android:gravity="center"
android:orientation="horizontal"
android:weightSum="5" >
<com.pocketdigi.components.MainTabButton_
android:id="@+id/home"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:layout_weight="1"
android:paddingLeft="10dp"
dayday:src="@drawable/tab_radio_home_normal"
dayday:text="首页" >
</com.pocketdigi.components.MainTabButton_>
</LinearLayout>`