Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 自定義組合控件和在自定義控件中使用自定義屬性

自定義組合控件和在自定義控件中使用自定義屬性

編輯:關於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
希望能對看到此文的小伙伴有所幫助

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