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);
}
}
}