編輯:關於Android編程
今天,整理了一下我平時的筆記,寫一個比較簡單的自定義組合控件,僅供小白參考,大神請繞道,希望能夠對大家有一些幫助 首先,得明白為什麼我們需要自定義組合控件,它是因為原有控件並不能滿足開發的需求,或者說並不能達到我們想要的一種效果,這個時候,就需要我們自己定義一些控件,以達到目的 !
個人總結自定義控件的步驟:
1、先寫一個布局,這裡我用的是一個相對布局,我這裡的相對布局就是根布局了
2、用一個類去繼承這個布局(相對布局),注意一下,這裡最好繼承這個布局的根布局,因為有可能會用到根布局裡的一些屬性
public class SettingItemView extends RelativeLayout{}
3、繼承布局的這個類會實現三個構造方法,一般情況下,用到那個就從寫那個,但是,如果你不知道要用到那個,那麼,你可以三個都實現,通過有一個參數和兩個參數的構造方法去調用第三個構造方法,因為第三個構造方法系統並不會自動幫我們調用
//這個構造方法系統不會幫我們調用,需要通過另外兩個方法來調用這個方法,那麼,這時候,初始化的一些數據就可一個在這個方法中實現
public SettingItemView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
//通過下面這兩個構造方法,去調用上面的那個構造方法
public SettingItemView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public SettingItemView(Context context) {
this(context,null);
}
下面是自定義組合控件的完整代碼`,在這裡我給它起名為SettingItemView.java
public class SettingItemView extends RelativeLayout{
public static final String NAMESPACE ="http://schemas.android.com/apk/res/com.xxx.myphonesafe";
private View view;
private TextView tv_title;
private ImageView iv_toggle;
boolean isToggle = false; //記錄當前開關的狀態
public SettingItemView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
//讀取布局文件中給自定義控件使用的屬性
//參數1:布局的命名空間
//參數2:布局中控件的屬性
//參數3:默認值,如果在讀取控件的屬性沒有讀取到時,就返回默認的值
/**
* backaground、title、isShowToggle為控件的自定義屬性
* 自定義屬性步驟:
* 1、在res/values下新建一個attrs.xml
* 2、在自定義類中通過attrs去獲取這些屬性,如attrs.getAttributeIntValue(NAMESPACE, "backgroundres", 0);
* 3、在布局文件中使用這些屬性時,需要聲明命名空間
* 4、 xmlns:abc="http://schemas.android.com/apk/res/com.xxx.myphonesafe"
* 注意以下三點:
* abc:可以隨便更換為其他字符,但是在下面使用屬性時必須保證和你更換後的字符串相同
* com.xxx.myphonesafe:對應的是你在清單文件中的包名,必須和清單文件一致,不能隨意更改
* NAMESPACE:命名空間必須和在布局中使用的命名空間一致
*/
//獲取布局中的屬性值
int backaground = attrs.getAttributeIntValue(NAMESPACE, "backgroundres", 0);
String title = attrs.getAttributeValue(NAMESPACE, "title");
boolean isShowToggle = attrs.getAttributeBooleanValue(NAMESPACE, "isshowtoggle", true);
//加載布局文件
initView();
//設置標題
tv_title.setText(title);
//根據屬性值設置條目
if(isShowToggle){
iv_toggle.setVisibility(View.VISIBLE);
}else {
iv_toggle.setVisibility(View.INVISIBLE);
}
//設置背景顏色
setBackGround(backaground);
}
private void setBackGround(int backaground) {
switch (backaground) {
case 0: //first
setBackgroundResource(R.drawable.first_normal);
break;
case 1: //middle
setBackgroundResource(R.drawable.middle_normal);
break;
case 2: //last
setBackgroundResource(R.drawable.last_normal);
break;
}
}
public SettingItemView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public SettingItemView(Context context) {
this(context,null);
}
/**
* 初始化布局文件
*/
private void initView() {
view = View.inflate(getContext(), R.layout.setting_item_view, null);
tv_title = (TextView) view.findViewById(R.id.tv_title); //獲取自動更新的id
iv_toggle = (ImageView) view.findViewById(R.id.iv_toggle); //獲取開關的id
addView(view);
}
/**
* 判斷開關 是否打開
* @param isToggle
* @return
*/
public boolean isToggle(){
return isToggle;
}
public void setToggle(boolean toggle){
//記錄當前的開關狀態
isToggle = toggle;
if(toggle){
//根據toggle的值切換圖片
iv_toggle.setImageResource(R.drawable.on);
}else {
iv_toggle.setImageResource(R.drawable.off);
}
}
}
自定義屬性如下:
在res/values下新建一個attrs.xml(attrs.xml這個文件的命名最好為attrs),代碼如下:
4、新建一個布局(暫且命名為a.xml),在布局中使用這個自定義的組合控件
注意,要在這裡引用命名空間,因為你用到了自定義屬性,而且要和自定義組合控件中的命名空間一致
最後,新建一個Activity,在Activity使用這個a.xml
希望能對看到此文的小伙伴有所幫助
對於側滑刪除已經是見慣不慣的了,我也一直有寫類似QQ那樣的側滑刪除控件的想法,雖然研究一段時間的自定義View,然對自定義ViewGroup實戰還是較少,並且側滑刪除還要
下面代碼設計了異步任務、JSon解析、自定義組件、IO流、文件下載、適配器原理等知識點。 代碼實現從服務器上讀取Json字符串。 Json字符串如下。 {object:{
當App中涉及到布局需要展示大量圖片時,你就應該考慮到“圖片比例適配“的問題。當圖片的寬高規格不同時,你設置展示的ImageView一. 自定義
一、前言自從上次發表了打造android萬能上拉下拉刷新框架——XRefreshView (一)之後,期間的大半個月一直都很忙,但是我每天晚上下班