Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 自定義組合控件

android 自定義組合控件

編輯:關於Android編程

自定義控件是一些android程序員感覺很難攻破的難點,起碼對我來說是這樣的,但是我們可以在網上找一些好的博客關於自定義控件好好拿過來學習研究下,多練,多寫點也能找到感覺,把一些原理弄懂,今天就講下自定義組合控件,這個特別適合在標題欄或者設置界面,看下面圖:

\

就非常適合使用組合控件了,現在寫一個玩玩:


<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+YWN0aXZpdHlfbWFpbi54bWw8L3A+CjxwPjwvcD4KPHByZSBjbGFzcz0="brush:java;">

SettingView.java
public class SettingView extends RelativeLayout {
	private TextView title;
	private TextView content;

	public SettingView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		initView(context);
	}

	public SettingView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initView(context);
		/**
		 * 獲取一個樣式的屬性集
		 * 把布局文件xml中的獲取到的樣式集合attrs跟自己自定義的樣式集合建立一個映射關系
		 */
		TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SettingView);
		String title = a.getString(0);
		String content = a.getString(1);
		//設置到界面上
		setTitle(title);
		setContent(content);
		a.recycle();
	}

	public SettingView(Context context) {
		super(context);
		initView(context);
	}
	
	private View initView(Context context){
		View view = View.inflate(context, R.layout.setting_view, this);
		title = (TextView) view.findViewById(R.id.title);
		content = (TextView) view.findViewById(R.id.content);
		return view;
	}
	
	public void setTitle(String tilte){
		title.setText(tilte);
	}
	public void setContent(String strContent){
		content.setText(strContent);
	}
	public void setTextSize(int size){
		content.setTextSize(size);
		title.setTextSize(size);
	}
}

setting_view.xml


android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="#22000000"
>

android:layout_width="fill_parent"
android:layout_height="wrap_content"

>
android:id="@+id/title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_marginTop="5dp"
android:layout_marginLeft="5dp"
/>
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:layout_marginLeft="5dp"
android:layout_below="@id/title"
/>
android:id="@+id/cb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
/>


android:layout_width="fill_parent"
android:layout_height="1px"
android:background="#000000"
android:layout_below="@id/cb"
/>

我們發現在activity_main.xml中有二個屬性

hy:title = "標題1"
hy:content = "內容1"

這個時候xml文件會報錯

error: Error parsing XML: unbound prefix 說沒有hy這樣的前綴,因為我們寫android:什麼屬性 都是因為有xmlns:android ="http://schemas.android.com/apk/res/android" 這樣一個命名空間在, 那我們也自定義一個命名空間,仿照上面的寫就是了 xmlns:hy ="http://schemas.android.com/apk/res/com.example.customcircle"//res後面的是你得包名
現在xml文件有報錯了: Multiple annotations found at this line: - error: No resource identifier found for attribute 'content' in package 'com.example.customcircle' 說在我們的包下沒有找到conent的定義
hy:title = "標題" hy:content = "內容" 是我自定義的屬性 如果要使用自定義的屬性,就要把這些屬性定義出來,而為什麼系統的android:屬性名---就可以呢?那是因為android sdk已經聲明好了,在找到我們使用的sdk D:\java\tools\adt-bundle-windows-x86_64-20130917\sdk\platforms\android-10\data\res\values在這個目錄下有一個attrs.xml文件,我們就找一個平時大家都會用到的















這就是TextView中的屬性,所以我們也要模仿他創建一個attrs文件在value目錄下
declare-styleable 聲明的意思 name表示 聲明的控件名稱 我們的 "SettingView"> 當保存的時候就會在你R.java文件中生成了一個內部類 public static final class attr {//屬性集 } 然後聲明屬性 "title" format="string"> "content" format="string" > name表示屬性的名稱 format表示屬性的類型
然後我們保存代碼 就沒錯誤提示了 然後再看R.java文件 public static final class attr { /**

Must be a string value, using '\\;' to escape characters such as '\\n' or '\\uxxxx' for a unicode character.

This may also be a reference to a resource (in the form "@[ package :]type : name") or theme attribute (in the form "?[ package :][type :] name") containing a value of this type. */ public static final int content=0x7f010001; /**

Must be a string value, using '\\;' to escape characters such as '\\n' or '\\uxxxx' for a unicode character.

This may also be a reference to a resource (in the form "@[ package :]type : name") or theme attribute (in the form "?[ package :][type :] name") containing a value of this type. */ public static final int title=0x7f010000; } 這個時候我們運行下我們的項目,發現這自定義的屬性並沒有起作用,那意思就是說我們要用代碼的方式讓它顯示出來
AttributeSet類表示屬性的集合 在我們定義的屬性 比如: android:id= "@+id/sv1" android:layout_width="fill_parent" android:layout_height="wrap_content" hy:title = "標題" hy:content = "內容" 相當於把這些屬性封裝成了一個類,這真是我們java強大之處,面向對象編程思想
然在構造函數中做這個操作
public SettingView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); /** * 獲取一個樣式的屬性集 * 把布局文件 xml中的獲取到的樣式集合 attrs跟自己自定義的樣式集合建立一個映射關系 */ TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SettingView ); String title = a.getString(0); String content = a.getString(1); //設置到界面上 setTitle(title); setContent(content); a.recycle(); } 這樣就算成功了

運行效果:

\

總結下自定義組合控件的步驟:

1. 寫一個類 繼承 ViewGroup LinearLayout RelativeLayout


2. 如果在布局文件裡面定義view對象 使用這個view對象的兩個參數的構造方法.


3. 定義這個自定義控件裡面要顯示的內容
View.inflate(context, R.layout.ui_setting_view, this);


4. 添加自定義控件的屬性.
定義自定義屬性的命名空間


5. 聲明自定義的屬性





觀察R文件 生成 attr內部類 生成styleable 數組 所有的attrs


6. 在xml布局文件裡面配置 自定義的屬性.


7. 在自定義view對象的構造方法裡面 獲取AttributeSet
跟我們自定義的屬性建立映射關系


8. 在自定義組合控件裡面 設置 布局文件的數據, 擴展點擊事件.


9. 在布局文件使用自定義的view對象.

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved