在开发当中,难免会遇到一个界面被几个地方服用的情况。举个简单的例子:Title,虽然Android原生自带的有,但是大部分的Title都需要根据自己需要做些修改,这样,就需要考虑到它的复用。
使用include标签
在layout文件夹创建一个新的线性布局title.xml:
<TextView
android:id="@+id/title_back_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="5dp"
android:background="@drawable/back"
android:textColor="#fff" />
<TextView
android:id="@+id/title_text_tv"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:layout_weight="1"
android:text="Title Text"
android:textColor="#000"
android:textSize="24sp" />
<TextView
android:id="@+id/title_edit_tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:padding="5dp"
android:background="@drawable/share"
android:textColor="#fff"
/>
这个布局非常的简单,就是一个返回键、标题名称和编辑键(图片用的是返回键的图标)。
- 在需要使用到这个头的布局中,通过include标签,进行引用:
<include layout="@layout/title"/>
这样在你书写include标签这个布局中,就会引用过来头布局了,非常的方便。
再次提高效率--自定义控件
虽然通过上面的方式是可以,非常方便的引用公共的可复用的布局,但是,若你需要使用这个布局中按钮,并且为其添加事件就麻烦的很了,比如大多时候我们的返回键只是执行了finish()。
试想一下,若你有10个页面都include这样的头布局,你需要在10个页面中各自书写相关的返回键监听事件,或者编辑事件,这费时费力。因此,我们可以考虑将这个title布局抽离出来,重新自己定义一个控件
- 新建一个TitleLayout继承LinearLayout
public class TitleLayout extends LinearLayout implements OnClickListener{
public TitleLayout(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.title, this);
}
构造函数,将写好的title利用inflate动态的加载进去
- 在需要title的layout中,加入这个自定义控件
<com.example.uicustomviews.TitleLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
></com.example.uicustomviews.TitleLayout>
注意:包名不能省略掉
- 在自定义控件中,findViewById()找到返回、编辑按钮,添加监听事件
完整的代码如下:
public class TitleLayout extends LinearLayout implements OnClickListener{
private TextView back_tv;
private TextView edit_tv;
public TitleLayout(Context context, AttributeSet attrs) {
super(context, attrs);
LayoutInflater.from(context).inflate(R.layout.title, this);
back_tv = (TextView)findViewById(R.id.title_back_tv);
edit_tv = (TextView)findViewById(R.id.title_edit_tv);
back_tv.setOnClickListener(this);
edit_tv.setOnClickListener(this);
}
@Override
public void onClick(View arg0) {
switch (arg0.getId()) {
case R.id.title_back_tv:
((Activity) getContext()).finish();
break;
case R.id.title_edit_tv:
Toast.makeText(getContext(), "this is the edit text ", 1000).show();
break;
}
}
这样,在任何一个引用这个Title布局的地方,我们都不需要再次找到Id,然后添加事件了,而且修改代码起来也很方便,自然也节省了很多的时间。