• (转)android自定义组合控件


    原文地址:http://mypyg.iteye.com/blog/968646

    目标:实现textview和ImageButton组合,可以通过Xml设置自定义控件的属性。 
    1.控件布局:以Linearlayout为根布局,一个TextView,一个ImageButton。 

    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="fill_parent" android:layout_height="fill_parent"  
    4.     android:gravity="center_vertical">  
    5.     <TextView android:layout_height="wrap_content" android:id="@+id/text1"  
    6.         android:layout_width="wrap_content"></TextView>  
    7.     <ImageButton android:layout_width="wrap_content"  
    8.         android:layout_height="wrap_content" android:id="@+id/btn1"></ImageButton>  
    9. </LinearLayout>  


    2.自定义控件代码,从LinearLayout继承: 

    Java代码  
    1. public class ImageBtnWithText extends LinearLayout {  
    2.   
    3.     public ImageBtnWithText(Context context) {  
    4.         this(context, null);  
    5.     }  
    6.       
    7.     public ImageBtnWithText(Context context, AttributeSet attrs) {  
    8.         super(context, attrs);  
    9.         LayoutInflater.from(context).inflate(R.layout.imagebtn_with_text, this, true);  
    10.         }  
    11. }  


    在构造函数中将Xml中定义的布局解析出来。 
    PS:有时执行此句代码时eclipse会输出找不到资源,而无法预览自定义控件。经试验确定是新增的布局没有生成资源,但是clean project重新生成也不行,最后重启eclipse解决。 
    3.在主界面布局xml中使用自定义控件: 

    Xml代码  
    1. <com.demo.widget2.ImageBtnWithText  
    2.         android:id="@+id/widget"  
    3.         android:layout_width="fill_parent"   
    4.         android:layout_height="fill_parent" />  


    即使用完整的自定义控件类路径:com.demo.widget2.ImageBtnWithText定义一个元素。 
    运行可以看到控件已经能够被加载到界面上。 
    4.给按钮设置图片和文本 
    如果图片是固定不变的,那么直接在控件布局中设置ImageButton的src属性即可。 
    4.1通过Java代码设置,在控件代码中提供函数接口: 

    Java代码  
    1. public void setButtonImageResource(int resId) {  
    2.         mBtn.setImageResource(resId);  
    3.     }  
    4.       
    5.     public void setTextViewText(String text) {  
    6.         mTv.setText(text);  
    7.     }  


    然后再在主界面的onCreate()通过函数调用设置即可。 
    4.2通过Xml设置属性 
    4.2.1首先定义Xml可以设置的属性集合,在values下创建attrs.xml,文件名可随意,一般都叫attrs.xml 

    Xml代码  
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <resources>  
    3.     <declare-styleable name="ImageBtnWithText">  
    4.         <attr name="android:text"/>  
    5.         <attr name="android:src"/>  
    6.     </declare-styleable>  
    7. </resources  


    属性集合名字:ImageBtnWithText,自己可根据实际来定义; 
    集合中包含的属性列表,每行一个属性。 
    4.2.2修改自定义控件实现代码,以获取xml中定义的属性 

    Java代码  
    1. TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ImageBtnWithText);  
    2. CharSequence text = a.getText(R.styleable.ImageBtnWithText_android_text);  
    3. if(text != null) mTv.setText(text);  
    4. Drawable drawable = a.getDrawable(R.styleable.ImageBtnWithText_android_src);  
    5. if(drawable != null) mBtn.setImageDrawable(drawable);  
    6. a.recycle()  


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

    Xml代码  
    1. <attr name="appendText" format="string"/>  


    和直接使用系统的attr不同的是要增加一个format属性,说明此属性是什么格式的。format可选项可参见注1 
    4.3.2使用自定义属性 

    Xml代码  收藏代码
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     xmlns:myspace="http://schemas.android.com/apk/res/com.demo.customwidget"  
    4.     android:orientation="vertical" android:layout_width="fill_parent"  
    5.     android:layout_height="fill_parent">  
    6.     <com.demo.widget2.ImageBtnWithText  
    7.         android:text="ABC" android:src="@drawable/icon" android:id="@+id/widget"  
    8.         android:layout_width="fill_parent" android:layout_gravity="center"  
    9.         android:layout_height="fill_parent" myspace:appendText="123456">  
    10.     </com.demo.widget2.ImageBtnWithText>  
    11. </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" 

  • 相关阅读:
    Redis学习(一)认识并安装redis
    并发编程(七)线程如何优雅地终止
    并发编程(六)Object类中线程相关的方法详解
    并发编程(五)线程同步
    并发编程(四)Thread类详解
    并发编程(三)线程池
    并发编程(二)Java中的多线程
    Python学习————作业
    Python学习————作业(面向对象)
    Python学习————面向对象和面向过程
  • 原文地址:https://www.cnblogs.com/BlogCommunicator/p/4933507.html
Copyright © 2020-2023  润新知