Layout头布局复用小技巧


在开发当中,难免会遇到一个界面被几个地方服用的情况。举个简单的例子: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,然后添加事件了,而且修改代码起来也很方便,自然也节省了很多的时间。

-------------The End-------------
请我喝一杯啤酒~