android布局优化之<include>标签的使用

1,<include>标签有什么用?

用来重用layout代码.

2,<include>标签该怎么用?

a,新建layout_common_title.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#00f"
    xmlns:tools="http://schemas.android.com/tools">
    <TextView
        android:id="@+id/tv_back"
        android:layout_width="50dp"
        android:layout_height="50dp" 
        android:background="@drawable/back"/>
    <TextView
        tools:text="标题"
        android:textSize="18sp"
        android:textColor="@android:color/white"
        android:layout_width="wrap_content"
        android:layout_height="match_parent" 
        android:gravity="center"
        android:layout_centerInParent="true"
        android:id="@+id/tv_title"/>
    <TextView
        android:id="@+id/tv_forward"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentRight="true"
        android:background="@drawable/forward"/>
</RelativeLayout>

b,在activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.wangzhichao.demo.MainActivity">

    <include
        android:id="@+id/main_common_title"
        layout="@layout/layout_common_title" />

</RelativeLayout>

c,在MainActivity.java中

public class MainActivity extends Activity {

    private TextView mTvTitle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTvTitle = (TextView) findViewById(R.id.tv_title);
        mTvTitle.setText("标题");
    }
}

d,运行效果


3,<include>标签使用时该注意些什么?

a,在<include>标签下设置的id,会把重用的那个layout的id屏蔽掉

a.1,在layout_common_title.xml中的根节点添加id

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:background="#00f"
    android:id="@+id/relativelayout_inside"
    xmlns:tools="http://schemas.android.com/tools">
 <!-省略掉一些代码->
</RelativeLayout>
a.2,在MainActivity.java中

public class MainActivity extends Activity {

    private TextView mTvTitle;
    private RelativeLayout mMainCommonTitle;
    private RelativeLayout mRelativeLayoutInside;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mTvTitle = (TextView) findViewById(R.id.tv_title);
        mTvTitle.setText("标题");

        mMainCommonTitle = (RelativeLayout) findViewById(R.id.main_common_title);
        mRelativeLayoutInside = (RelativeLayout) findViewById(R.id.relativelayout_inside);
        Log.d("MainActivity", "mMainCommonTitle:" + mMainCommonTitle);
        Log.d("MainActivity", "mRelativeLayoutInside:" + mRelativeLayoutInside);
    }
}

查看日志如下:

06-09 00:53:50.020 6587-6587/? D/MainActivity: mMainCommonTitle:android.widget.RelativeLayout{c15bc58 V.E..... ......ID 0,0-0,0 #7f0b0056 app:id/main_common_title}
06-09 00:53:50.020 6587-6587/? D/MainActivity: mRelativeLayoutInside:null

解决办法:1,根容器id与include id设置相同2,若id不同,那么只设置一个就好了

b.在<include>标签下设置其他属性值的问题

b.1,在使用include标签时,除了使用layout属性加载布局文件时,一般不需要设置其他属性了,也就是使用layout属性就够了.

b.2,有时为了布局的需要,仍要使用诸如layout_margin等除id之外的其他属性,这时就要注意,为了使这些其他属性起作用,必须同时设置include标签的宽高属性.而且只能设置layout_xxx的属性,设置其他属性是不会起作用的.例如,

 <include
        android:id="@+id/main_common_title"
        layout="@layout/layout_common_title"
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:layout_alignParentBottom="true" />

运行截图,位置和高度都发生了变化.


b.3,include标签的宽高属性值会覆盖根节点设置的宽高属性值.

解决办法:在<include>标签下设置其他属性,是对layout的根节点属性的重新设置.因为通过layout属性引用的layout都是一样的,而通过设置其他属性才能产生一些变化,这就是不变中的变.

c.<include>标签有个缺点,就是可能产生多余的层级,比如,被复用布局是一个垂直的LinearLayout布局,当以include标签插入到另一个垂直的LinearLayout布局中时,结果就是一个垂直的LinearLayout里包含一个垂直的LinearLayout,这个嵌套的布局并没有实际意义,只会让UI性能变差.这时就可以使用merge标签.

参考资料:

1,http://blog.csdn.net/u011277123/article/details/52774428

2,http://blog.csdn.net/shuqiaoniu/article/details/46013771

猜你喜欢

转载自blog.csdn.net/willway_wang/article/details/72945114