自定义View(一)组合View
2016-08-11 本文已影响276人
请你吃鱼
自定义View对于初学Android或许是一座很难逾越的大山,当然对于本人也不例外,但是我们总得要进步啊,本篇文章就对自定义View中最简单的自定义组合View做一个说明。
首先来看一个我们在开发过程中经常遇到的标题栏,熟悉的不能再熟悉了,那么布局文件大概可以这么写:
<RelativeLayout
android:id="@+id/top"
android:layout_width="match_parent"
android:layout_height="@dimen/common_dian_44"
android:background="@color/common_green">
<ImageView
android:id="@+id/back_image"
android:layout_width="@dimen/common_dian_44"
android:layout_height="match_parent"
android:layout_centerVertical="true"
android:background="@drawable/login_button_select"
android:onClick="back"
android:scaleType="center"
android:src="@drawable/icon_common_back_image"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:text="@string/checkdata"
android:textColor="@color/white"
android:textSize="18sp"/>
</RelativeLayout>
非常简单的代码,但是如果我们每个页面都有这么一个标题栏,难道我们都要这么写一遍吗?有人说我们可以使用include标签啊,的确可以,但是include仅仅是布局上的引用,如果这个布局需要有自己的逻辑呢,我们还是需要在activity中写一遍,倒不如全部写在自定义View,中那如果用自定义组合控件应该怎么做呢?
首先我们需要将上面的代码提取出来,创建一个布局文件,然后创建一个类继承RelativeLayout,重写构造方法并找到控件
public BiaotiView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.biaoti_layout, this, true);
iv = (ImageView) findViewById(R.id.back_iv);
tv = (TextView) findViewById(R.id.title_tv);
}
然后创建一个方法来设置标题
public void setTitle(String title) {
tv.setText(title);
}
当然我们也可以通过attrs自定义属性,这里暂且不提,等到下一篇自定义View再讲。自定义组合View这样就好了,然后我们在布局文件中写上全名就可以显示了,但是这里还有一个问题,返回的监听事件怎么办呢,这里我们可以写一个接口,就像这样:
public void setOnBackListener(OnBackListener onBackListener) {
this.onBackListener = onBackListener;
}
public BiaotiView(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.biaoti_layout, this, true);
iv = (ImageView) findViewById(R.id.back_iv);
tv = (TextView) findViewById(R.id.title_tv);
iv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (onBackListener != null) onBackListener.back();
}
});
}
public interface OnBackListener {
void back();
}
然后再activity中使用的时候设置监听就可以啦。
biaotiView.setOnBackListener(new BiaotiView.OnBackListener() {
@Override
public void back() {
finish();
}
});
好了,自定义组合View到这里就结束了,以后大家遇到重复使用的布局也可以这么做,不但节约时间,而且也可以使布局文件更加简洁,下篇文章我会说一下如何继承View从无到有自定义一个属于自己的控件。