在开发当中,难免会遇到一个界面被几个地方服用的情况。举个简单的例子:Title,虽然Android原生自带的有,但是大部分的Title都需要根据自己需要做些修改,这样,就需要考虑到它的复用。

使用include标签

  • 首先创建一个复用的Title布局
在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,然后添加事件了,而且修改代码起来也很方便,自然也节省了很多的时间。