編輯:關於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_height="wrap_content"
android:orientation="vertical"
android:background="#22000000"
>
android:layout_height="wrap_content"
>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:layout_marginTop="5dp"
android:layout_marginLeft="5dp"
/>
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="16sp"
android:layout_marginLeft="5dp"
android:layout_below="@id/title"
/>
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
/>
android:layout_height="1px"
android:background="#000000"
android:layout_below="@id/cb"
/>
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後面的是你得包名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對象.
前言ImageView是android開發中非常常用的一種控件,在顯示圖片時,我們可以直接拿來用,也可以根據使用場景,結合幾種不同的顯示方式ScaleType,來對顯示的
Android開發之MVP模式的學習:提問:明白如何選擇開發框架,和為什麼要學MVP模式觀察:比較MVC模式和MVP模式,理解MVP模式的概念使用:通過一個例子,學習如何
使用樣式文件,在values 目錄下新建styles.xml文件,編寫如下代碼: 復制代碼 代碼如下: Code highlighting produced by Act
0x1 開始Anddroid上的ART從5.0之後變成默認的選擇,可見ART的重要性,目前關於Dalvik Hook方面研究的文章很多,但我在網上