Android创建组合控件


大家有时候做Android练习的时候就可以感觉出Android框架给出的ui控件有点不是很够用了,更别说在实际项目中, 很多人会想要使用自定义View来完成,这是非常不错的方法,同时如果你觉得android框架原有的ui控件稍微的变一下,或者多个ui控件组合在一起就可以达到了你想要的效果岂不是更方便。。




下图为效果图加源布局文件:







android设置两个控件高度相等 android 组合控件_布局





通过这张图可以看出, 我们还是自定义了一个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);
        }
    }


    
}