天天看点

Android 自定义标签 和 自定义组件 1    自定义标签 2    自定义组件 3    使用方法 4    结果展示

这是我的模板项目目录

Android 自定义标签 和 自定义组件 1    自定义标签 2    自定义组件 3    使用方法 4    结果展示

既然想像 android:text  那样使用自己的标签,那么首先得有标签。

在 res/values/ 下我新建了个 mm_tag.xml (切记不可出现大写,只能是 小写字母、数字、下划线)

mm_tag.xml

<?xml version="1.0" encoding="utf-8"?>  

<resources>  

    <declare-styleable name="griditem">  

        <attr name="bkground" format="reference|color"/>  

        <attr name="text1"    format="string"/>  

        <attr name="text2"    format="string"/>  

        <attr name="image"    format="reference|integer"/>  

    </declare-styleable>      

</resources>  

format 参考:

1. reference:参考某一资源id

2. color:颜色值

3. boolean:布尔值

4. dimension:尺寸值

5. float:浮点值

6. integer:整型值

7. string:字符串

8. fraction:百分数

9. enum:枚举值

//属性定义:  

< declare -styleable name = "名称" >  

    <attr name = "orientation" >  

        <enum name = "horizontal" value = "0" />  

        <enum name = "vertical" value = "1" />  

    </attr>                        

</ declare -styleable>  

//属性使用:  

<linearlayout  

    xmlns:android = "http://schemas.android.com/apk/res/android"  

    android:orientation = "vertical"  

    android:layout_width = "fill_parent"  

    android:layout_height = "fill_parent"  

>  

</linearlayout>  

10. flag:位或运算

    <attr name = "windowsoftinputmode" >  

        <flag name = "stateunspecified" value = "0" />  

        <flag name = "stateunchanged" value = "1" />  

        <flag name = "statehidden" value = "2" />  

    </attr>                  

<activity  

    android: name = ".styleandthemeactivity"  

    android:label = "@string/app_name"  

    android:windowsoftinputmode = "stateunspecified | stateunchanged | statehidden" >  

    <intent-filter>  

        < action android: name = "android.intent.action.main" />  

        <category android: name = "android.intent.category.launcher" />  

    </intent-filter>  

</activity>  

<code></code>

11.注意:属性定义时可以指定多种类型值。

    &lt;attr name = "background" format = "reference|color" /&gt;  

&lt;imageview  

    android:layout_width = "42dip"  

    android:layout_height = "42dip"  

    android: background = "@drawable/图片id|#00ff00" /&gt;  

比如我们在布局中使用自定义组件 griditem:

首先 声明好 标签的命名空间

xmlns:griditem = "http://schemas.android.com/apk/res/com.mm.template"  

//对比下 android 的命名空间:  

xmlns:android = "http://schemas.android.com/apk/res/android"  

发现只有 res/后面的不同,com.mm.template 是我的应用程序包名,通过上文中的 项目目录图片可以看出来,

griditem 是我随便想的一个命名空间的名字。

接下来就是使用自定义组件

&lt; com.mm.template.griditem  

     griditem:image = "@drawable/mm_1"  

     android:padding = "5dp"  

     android:layout_width = "wrap_content"  

     android:layout_height = "wrap_content"  

     android:layout_weight = "1"  

     griditem:bkground = "@color/orange"  

     griditem:text1 = "android"       griditem:text2 = "手机开发" /&gt;  

其中 用到了我们的自定义标签:

griditem:image = "@drawable/mm_1"  

griditem:bkground = "@color/orange"  

griditem:text1 = "android"  

griditem:text2 = "手机开发"  

怎么获取标签传回的数据呢呢?

在自定义组件 griditem 的实现代码中使用如下方法即可

public griditem(context context, attributeset attrs) {  

    super(context, attrs);  

    typedarray typedarray=context.obtainstyledattributes(attrs, r.styleable.griditem);  

    bk_color =typedarray.getresourceid(r.styleable.griditem_bkground, r.color.burlywood);  

    text1 =typedarray.getstring(r.styleable.griditem_text1);  

    text2 =typedarray.getstring(r.styleable.griditem_text2);  

    image=typedarray.getdrawable(r.styleable.griditem_image);  

    typedarray.recycle();  

    view=layoutinflater.from(context).inflate(r.layout.mm_grid_item, this,true);  

    layout=(linearlayout)view.findviewbyid(r.id.item_layout);  

    textview1=(textview)view.findviewbyid(r.id.text1);  

    textview2=(textview)view.findviewbyid(r.id.text2);  

    imageview=(imageview)view.findviewbyid(r.id.imageview);  

    layout.setbackgroundresource(bk_color); //设置背景色  

    textview1.settext(text1);               //设置第一行文字  

    textview2.settext(text2);               //设置第二行文字  

    imageview.setimagedrawable(image);      //设置图标  

}  

即可获得 我们自定义标签传过来的数据,并且正确的在界面中显示出来。

下面我将结合自定义 组件 griditem 来一起讲。

我想实现一个组件,类似于这样的

Android 自定义标签 和 自定义组件 1    自定义标签 2    自定义组件 3    使用方法 4    结果展示

方法有很多种,自定义布局即可,现在我想让它以组件的形式在 布局中直接 像 textview 一样使用,

Android 自定义标签 和 自定义组件 1    自定义标签 2    自定义组件 3    使用方法 4    结果展示

那么就用到自定义组件。

下面我将实现一个自定义组件 griditem 实现。

一般都是继承于 layout(我用继承于view时出现问题 ~~!)

griditem.java

package com.mm.template;  

import android.content.context;  

import android.content.res.typedarray;  

import android.graphics.drawable.drawable;  

import android.util.attributeset;  

import android.view.layoutinflater;  

import android.view.view;  

import android.widget.imageview;  

import android.widget.linearlayout;  

import android.widget.textview;  

public class griditem extends linearlayout {  

    private int bk_color;   //背景色  

    private string text1;   //第一行文字  

    private string text2;   //第二行文字  

    private drawable image; //图标  

    private linearlayout layout;  

    private textview textview1;  

    private textview textview2;  

    private imageview imageview;  

    private view view;  

    public griditem(context context, attributeset attrs) {  

        super(context, attrs);  

        typedarray typedarray=context.obtainstyledattributes(attrs, r.styleable.griditem);  

        bk_color =typedarray.getresourceid(r.styleable.griditem_bkground, r.color.burlywood);  

        text1 =typedarray.getstring(r.styleable.griditem_text1);  

        text2 =typedarray.getstring(r.styleable.griditem_text2);  

        image=typedarray.getdrawable(r.styleable.griditem_image);  

        typedarray.recycle();  

        view=layoutinflater.from(context).inflate(r.layout.mm_grid_item, this,true);  

        layout=(linearlayout)view.findviewbyid(r.id.item_layout);  

        textview1=(textview)view.findviewbyid(r.id.text1);  

        textview2=(textview)view.findviewbyid(r.id.text2);  

        imageview=(imageview)view.findviewbyid(r.id.imageview);  

        layout.setbackgroundresource(bk_color); //设置背景色  

        textview1.settext(text1);               //设置第一行文字  

        textview2.settext(text2);               //设置第二行文字  

        imageview.setimagedrawable(image);      //设置图标  

    }  

这个自定义组件 griditem 用到的布局文件

mm_grid_item.xml

&lt;? xml   version = "1.0"    encoding = "utf-8" ?&gt;  

&lt; linearlayout   xmlns:android = "http://schemas.android.com/apk/res/android"  

     xmlns:tools = "http://schemas.android.com/tools"  

     android: id = "@+id/item_layout"  

     android:layout_width = "match_parent"  

     android:layout_height = "match_parent"  

     android:orientation = "vertical"  

     android: background = "@color/black"  

     android:padding = "3dp"  

     android:paddingleft = "6dp"  

     tools:ignore = "hardcodedtext,contentdescription"    &gt;  

     &lt; textview  

         android: id = "@+id/text1"  

         android:layout_weight = "1"  

          style = "@style/mm_textview" /&gt;  

         android: id = "@+id/text2"  

         android:textsize = "12sp"  

     &lt; imageview  

         android: id = "@+id/imageview"  

         android:layout_width = "wrap_content"  

         android:layout_height = "0dp"  

         android:layout_gravity = "right"  

         android: src = "@drawable/mm_title_1"     

         android:layout_weight = "2"  

         android:layout_margintop = "10dp"  

         android:scaletype = "fitcenter" /&gt;  

      &lt;!--图片缩放  

        android:scalex="0.8"  

        android:scaley="0.8" --&gt; &lt;/ linearlayout &gt;  

在 main_layout.xml (我的主布局文件)中使用

     xmlns:griditem = "http://schemas.android.com/apk/res/com.mm.template"  

     android: background = "@color/white"  

     tools:ignore = "hardcodedtext,contentdescription,nestedweights"    &gt;  

      &lt;!-- head start --&gt;  

     &lt; linearlayout  

         android:layout_width = "match_parent"  

         android:layout_height = "44dp"  

         android:orientation = "horizontal"  

         android:padding = "10dp"  

         android: background = "@color/red" &gt;  

         &lt; imageview  

             android:layout_width = "wrap_content"  

             android:layout_height = "match_parent"  

             android: src = "@drawable/mm_title_1"    /&gt;  

         &lt; textview  

             android:layout_width = "0dp"  

             android:layout_weight = "1"  

             android:gravity = "center"  

             android: text = "测试案例"  

             android:textstyle = "bold"  

             android:textsize = "16sp"  

             android:textcolor = "@android:color/white" /&gt;  

             android: src = "@drawable/mm_title_2"    /&gt;  

     &lt;/ linearlayout &gt;  

      &lt;!-- head end   --&gt;  

      &lt;!-- search start--&gt;  

         android:layout_height = "36dp"  

         android:orientation = "vertical"  

         android:paddingtop = "3dp"     

         android:layout_margin = "8dp" &gt;  

         &lt; edittext  

             android: id = "@+id/search_edit"  

             android:layout_width = "match_parent"  

             android:drawableleft = "@drawable/mm_search"  

               android: background = "@drawable/mm_shape_editview"  

               android:hint = "请输入关键字"  

             android:textcolorhint = "@color/darkgray"  

             android:padding = "6dp" /&gt;  

      &lt;!-- search end  --&gt;  

      &lt;!-- griditem start  --&gt;  

     &lt; linearlayout    

           android:layout_width = "match_parent"  

           android:layout_height = "0dp"  

           android:layout_weight = "1"  

           android:orientation = "horizontal"  

         android:layout_margin = "10dp" &gt;  

         &lt; com.mm.template.griditem  

             griditem:image = "@drawable/mm_1"  

             android:padding = "5dp"  

               android:layout_width = "wrap_content"  

               android:layout_height = "wrap_content"  

               android:layout_weight = "1"  

               griditem:bkground = "@color/orange"  

               griditem:text1 = "android"  

               griditem:text2 = "手机开发" /&gt;  

             griditem:image = "@drawable/mm_2"  

               griditem:bkground = "@color/blueviolet"  

               griditem:text1 = "c++"  

               griditem:text2 = "编程语言" /&gt;  

             griditem:image = "@drawable/mm_3"  

               griditem:bkground = "@color/blue"  

               griditem:text1 = "服务端"  

               griditem:text2 = "后台开发" /&gt;  

      &lt;!-- griditem end  --&gt; &lt;/ linearlayout &gt;  

也就是 &lt;com /&gt; 标签为我们自定义的 griditem 组件。

Android 自定义标签 和 自定义组件 1    自定义标签 2    自定义组件 3    使用方法 4    结果展示

参考来源: &lt;http://blog.sina.com.cn/s/blog_62ef2f14010105vi.html&gt;

继续阅读