Android創建組合控件

Android創建組合控件

大家有時候做Android練習的時候就可以感覺出Android框架給出的ui控件有點不是很夠用了,更別說在實際項目中, 很多人會想要使用自定義View來完成,這是非常不錯的方法,同時如果你覺得android框架原有的ui控件稍微的變一下,或者多個ui控件組合在一起就可以達到了你想要的效果豈不是更方便。。


下圖爲效果圖加源佈局文件:




通過這張圖可以看出, 我們還是自定義了一個View, 只不過這個自定義View裏面使用的都是源Android框架提供的控件。

該類的邏輯效果爲:
這是一個TextView與ImageView的集合,如果該控件用戶指定了圖片,那麼就把該控件當成ImageView來用,如果沒有指定圖片資源,那麼就當成TextView來用。。。


(就是這麼一個簡單的邏輯、、


很明顯,我們定義的這個類裏面就只是集成了TextView與ImageView, 其中兩個都不用你自己寫,只要調用即可。

1、定義一個類(ImageTextButton)繼承於FrameLayout


public class ImageTextButton extends FrameLayout

2、在該類中把需要的控件給聲明出來

private ImageView mImageView;
private TextView mTextView;

3、實現該構造方法

public ImageTextButton(Context context) {
        this(context, null);
    }

    public ImageTextButton(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ImageTextButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, android.R.attr.buttonStyle);
    }
構造函數有三個,分別對應於不同的創建方式。
只有一位參數的構造函數對應於使用Java代碼創建的調用。
具有兩位參數的構造函數對應於使用XML佈局創建的調用。
具有三位參數的構造函數對應於使用XML佈局創建並且制定了Style屬性的調用!
(看清楚每個構造的調用方式)

4、在第三個構造函數中,進行我們的代碼邏輯控制

4.1) 進行我們的類屬性初始化
mImageView = new ImageView(context, attrs, defStyleAttr);
mTextView = new TextView(context, attrs, defStyleAttr);
在創建的時候,把那幾個參數丟進行可以使用我們在XML中原有的屬性,從而不需要我們自己進行聲明
4.2) 創建我們控件的佈局方式
// 創建視圖的佈局對其方式
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER);

        addView(mImageView, params);
        addView(mTextView, params);
這塊代碼就不解釋了, 不懂的可Google
4.3) 邏輯實現
其實我們的代碼實現的邏輯非常的簡單,就是判斷一下該view是否制定了android:text屬性即可,如果沒有就把它給隱藏和顯示
/**
 * 兩種模式來回切換
*/
        if (mImageView.getDrawable() == null) {
            mImageView.setVisibility(View.GONE);
            mTextView.setVisibility(View.VISIBLE);
        } else {
            mImageView.setVisibility(View.VISIBLE);
            mTextView.setVisibility(View.GONE);
        }
非常簡單啊。。。。。  這就完成了。



以下部分就是完整的源代碼:
public class ImageTextButton extends FrameLayout {

    private ImageView mImageView;
    private TextView mTextView;

    public ImageTextButton(Context context) {
        this(context, null);
    }

    public ImageTextButton(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ImageTextButton(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, android.R.attr.buttonStyle);
        /**
         * 初始化數據
         */
        mImageView = new ImageView(context, attrs, defStyleAttr);
        mTextView = new TextView(context, attrs, defStyleAttr);
        // 創建視圖的佈局對其方式
        FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, Gravity.CENTER);

        addView(mImageView, params);
        addView(mTextView, params);

        /**
         * 兩種模式來回切換
         */
        if (mImageView.getDrawable() == null) {
            mImageView.setVisibility(View.GONE);
            mTextView.setVisibility(View.VISIBLE);
        } else {
            mImageView.setVisibility(View.VISIBLE);
            mTextView.setVisibility(View.GONE);
        }
    }


    
}








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章