Android自定义组合控件

目标:实现textview和ImageButton组合,可以通过Xml设置自定义控件的属性。
[b][size=x-large]1.控件布局:以Linearlayout为根布局,一个TextView,一个ImageButton。[/size][/b]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:gravity="center_vertical">
<TextView android:layout_height="wrap_content" android:id="@+id/text1"
android:layout_width="wrap_content"></TextView>
<ImageButton android:layout_width="wrap_content"
android:layout_height="wrap_content" android:id="@+id/btn1"></ImageButton>
</LinearLayout>

[b][size=x-large]2.自定义控件代码,从LinearLayout继承:[/size][/b]
public class ImageBtnWithText extends LinearLayout {

public ImageBtnWithText(Context context) {
this(context, null);
}

public ImageBtnWithText(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.imagebtn_with_text, this, true);
}
}

在构造函数中将Xml中定义的布局解析出来。
PS:有时执行此句代码时eclipse会输出找不到资源,而无法预览自定义控件。经试验确定是新增的布局没有生成资源,但是clean project重新生成也不行,最后重启eclipse解决。
[b][size=x-large]3.在主界面布局xml中使用自定义控件:[/size][/b]
<com.demo.widget2.ImageBtnWithText
android:id="@+id/widget"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />

即使用完整的自定义控件类路径:com.demo.widget2.ImageBtnWithText定义一个元素。
运行可以看到控件已经能够被加载到界面上。
[b][size=x-large]4.给按钮设置图片和文本[/size][/b]
如果图片是固定不变的,那么直接在控件布局中设置ImageButton的src属性即可。
[b][size=large]4.1通过Java代码设置,在控件代码中提供函数接口:[/size][/b]
public void setButtonImageResource(int resId) {
mBtn.setImageResource(resId);
}

public void setTextViewText(String text) {
mTv.setText(text);
}

然后再在主界面的onCreate()通过函数调用设置即可。
[b][size=large]4.2通过Xml设置属性[/size][/b]
[b]4.2.1首先定义Xml可以设置的属性集合,在values下创建attrs.xml,文件名可随意,一般都叫attrs.xml[/b]
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ImageBtnWithText">
<attr name="android:text"/>
<attr name="android:src"/>
</declare-styleable>
</resources

属性集合名字:ImageBtnWithText,自己可根据实际来定义;
集合中包含的属性列表,每行一个属性。
[b]4.2.2修改自定义控件实现代码,以获取xml中定义的属性[/b]
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImageBtnWithText);
CharSequence text = a.getText(R.styleable.ImageBtnWithText_android_text);
if(text != null) mTv.setText(text);
Drawable drawable = a.getDrawable(R.styleable.ImageBtnWithText_android_src);
if(drawable != null) mBtn.setImageDrawable(drawable);
a.recycle()

首先通过context.obtainStyledAttributes获得所有属性数组;
然后通过TypedArray类的getXXXX()系列接口获得相应的值。
[b]4.2.3在主界面布局中设置自定义控件的属[/b]
android:text="ABC" android:src="@drawable/icon
[b][size=large]4.3自定义名称属性:[/size][/b]
在4.2中使用的属性名是android系统命名空间的,都以android开头,比如android:text等。
实际开发中会自定义一些属性名,这些属性名仍然定义在4.2.1提到的attrs.xml中:
[b]4.3.1定义属性名[/b]
<attr name="appendText" format="string"/>

和直接使用系统的attr不同的是要增加一个format属性,说明此属性是什么格式的。format可选项可参见注1
[b]4.3.2使用自定义属性[/b]
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:myspace="http://schemas.android.com/apk/res/com.demo.customwidget"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<com.demo.widget2.ImageBtnWithText
android:text="ABC" android:src="@drawable/icon" android:id="@+id/widget"
android:layout_width="fill_parent" android:layout_gravity="center"
android:layout_height="fill_parent" myspace:appendText="123456">
</com.demo.widget2.ImageBtnWithText>
</LinearLayout>

直接在主布局文件中使用此属性appendText="abc"是不会设置生效的,而是要在主布局xml中定义一个xml命名空间:
xmlns:myspace="http://schemas.android.com/apk/res/com.demo.customwidget"
命名空间的名字可以自己随便定义,此处为myspace,即xmlns:myspace;
后面的地址则有限制,其开始必须为:"http://schemas.android.com/apk/res/",后面则是包名com.demo.customwidget,
此处的包名与AndroidManifest.xml中<manifest>节点的属性package="com.demo.customwidget"一致,不是自定义控件Java代码所在的包,当然简单的程序自定义控件Java代码也一般在此包内。

注1:
注1:format可选项
"reference" //引用
"color" //颜色
"boolean" //布尔值
"dimension" //尺寸值
"float" //浮点值
"integer" //整型值
"string" //字符串
"fraction" //百分数,比如200%
枚举值,格式如下:
<attr name="orientation">
<enum name="horizontal" value="0" />
<enum name="vertical" value="1" />
</attr>
xml中使用时:
android:orientation = "vertical"

标志位,位或运算,格式如下:
<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>
xml中使用时:
android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden">


另外属性定义时可以指定多种类型值,比如:
<attr name = "background" format = "reference|color" />
xml中使用时:
android:background = "@drawable/图片ID|#00FF00"
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的纺织品企业财务管理系统,源码+数据库+毕业论文+视频演示 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对纺织品企业财务信息管理的提升,也为了对纺织品企业财务信息进行更好的维护,纺织品企业财务管理系统的出现就变得水到渠成不可缺少。通过对纺织品企业财务管理系统的开发,不仅仅可以学以致用,让学到的知识变成成果出现,也强化了知识记忆,扩大了知识储备,是提升自我的一种很好的方法。通过具体的开发,对整个软件开发的过程熟练掌握,不论是前期的设计,还是后续的编码测试,都有了很深刻的认知。 纺织品企业财务管理系统通过MySQL数据库与Spring Boot框架进行开发,纺织品企业财务管理系统能够实现对财务人员,员工,收费信息,支出信息,薪资信息,留言信息,报销信息等信息的管理。 通过纺织品企业财务管理系统对相关信息的处理,让信息处理变的更加的系统,更加的规范,这是一个必然的结果。已经处理好的信息,不管是用来查找,还是分析,在效率上都会成倍的提高,让计算机变得更加符合生产需要,变成人们不可缺少的一种信息处理工具,实现了绿色办公,节省社会资源,为环境保护也做了力所能及的贡献。 关键字:纺织品企业财务管理系统,薪资信息,报销信息;SpringBoot
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值