天天看點

【Android基礎入門〖17〗】自定義标簽 和 自定義元件1    自定義标簽2    自定義元件3    使用方法4    結果展示

1    自定義标簽

這是我的模闆項目目錄

【Android基礎入門〖17〗】自定義标簽 和 自定義元件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:位或運算

//屬性定義:
< declare -styleable name = "名稱" >
    <attr name = "windowSoftInputMode" >
        <flag name = "stateUnspecified" value = "0" />
        <flag name = "stateUnchanged" value = "1" />
        <flag name = "stateHidden" value = "2" />
    </attr>                
</ declare -styleable>

//屬性使用:
<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>           

11.注意:屬性定義時可以指定多種類型值。

//屬性定義:
< declare -styleable name = "名稱" >
    <attr name = "background" format = "reference|color" />
</ declare -styleable>

//屬性使用:
<ImageView
    android:layout_width = "42dip"
    android:layout_height = "42dip"
    android: background = "@drawable/圖檔ID|#00FF00" />           

第二步:    在自定義元件中獲得标簽傳回的資料

比如我們在布局中使用自定義元件 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 是我随便想的一個命名空間的名字。 接下來就是使用自定義元件

< 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 = "手機開發" />           

其中 用到了我們的自定義标簽:

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 來一起講。

2    自定義元件

我想實作一個元件,類似于這樣的  

【Android基礎入門〖17〗】自定義标簽 和 自定義元件1    自定義标簽2    自定義元件3    使用方法4    結果展示

  方法有很多種,自定義布局即可,現在我想讓它以元件的形式在 布局中直接 像 TextView 一樣使用,

【Android基礎入門〖17〗】自定義标簽 和 自定義元件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

<? xml   version = "1.0"    encoding = "utf-8" ?>
< 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"    >
     < TextView
         android: id = "@+id/text1"
         android:layout_weight = "1"
          style = "@style/MM_TextView" />
     < TextView
         android: id = "@+id/text2"
         android:layout_weight = "1"
         android:textSize = "12sp"
          style = "@style/MM_TextView" />
     < 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" />
    
      <!--圖檔縮放
        android:scaleX="0.8"
        android:scaleY="0.8" --> </ LinearLayout >           

3    使用方法

在 main_layout.xml (我的主布局檔案)中使用

< LinearLayout   xmlns:android = "http://schemas.android.com/apk/res/android"
     xmlns:tools = "http://schemas.android.com/tools"
     xmlns:griditem = "http://schemas.android.com/apk/res/com.mm.template"
     android:layout_width = "match_parent"
     android:layout_height = "match_parent"
     android: background = "@color/white"
     android:orientation = "vertical"
     tools:ignore = "HardcodedText,ContentDescription,NestedWeights"    >
    
      <!-- Head start -->
     < LinearLayout
         android:layout_width = "match_parent"
         android:layout_height = "44dp"
         android:orientation = "horizontal"
         android:padding = "10dp"
         android: background = "@color/red" >
         < ImageView
             android:layout_width = "wrap_content"
             android:layout_height = "match_parent"
             android: src = "@drawable/mm_title_1"    />
         < TextView
             android:layout_width = "0dp"
             android:layout_height = "match_parent"
             android:layout_weight = "1"
             android:gravity = "center"
             android: text = "測試案例"
             android:textStyle = "bold"
             android:textSize = "16sp"
             android:textColor = "@android:color/white" />
         < ImageView
             android:layout_width = "wrap_content"
             android:layout_height = "match_parent"
             android: src = "@drawable/mm_title_2"    />
     </ LinearLayout >
      <!-- Head end   -->
    
      <!-- Search start-->
     < LinearLayout
         android:layout_width = "match_parent"
         android:layout_height = "36dp"
         android:orientation = "vertical"
         android:paddingTop = "3dp"   
         android:layout_margin = "8dp" >
         < EditText
             android: id = "@+id/search_edit"
             android:layout_width = "match_parent"
             android:layout_height = "match_parent"
             android:drawableLeft = "@drawable/mm_search"
               android: background = "@drawable/mm_shape_editview"
               android:hint = "請輸入關鍵字"
             android:textSize = "16sp"
             android:textColorHint = "@color/darkgray"
             android:textStyle = "bold"
             android:padding = "6dp" />
     </ LinearLayout >
      <!-- Search end  -->
      <!-- GridItem start  -->
     < LinearLayout  
           android:layout_width = "match_parent"
           android:layout_height = "0dp"
           android:layout_weight = "1"
           android:orientation = "horizontal"
         android:layout_margin = "10dp" >
         < 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 = "手機開發" />
         < com.mm.template.GridItem
             griditem:image = "@drawable/mm_2"
             android:padding = "5dp"
               android:layout_width = "wrap_content"
               android:layout_height = "wrap_content"
               android:layout_weight = "1"
               griditem:bkground = "@color/blueviolet"
               griditem:text1 = "C++"
               griditem:text2 = "程式設計語言" />
         < com.mm.template.GridItem
             griditem:image = "@drawable/mm_3"
             android:padding = "5dp"
               android:layout_width = "wrap_content"
               android:layout_height = "wrap_content"
               android:layout_weight = "1"
               griditem:bkground = "@color/blue"
               griditem:text1 = "服務端"
               griditem:text2 = "背景開發" />
     </ LinearLayout >
      <!-- GridItem end  --> </ LinearLayout >           

也就是 <com /> 标簽為我們自定義的 GridItem 元件。

4    結果展示

【Android基礎入門〖17〗】自定義标簽 和 自定義元件1    自定義标簽2    自定義元件3    使用方法4    結果展示

      參考 來源: < http://blog.sina.com.cn/s/blog_62ef2f14010105vi.html >     注:轉載請注明出處 :)   畢竟代碼是一個一個敲出來的啊,O(∩_∩)O~