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

来源:互联网 发布:王珊数据库视频教程 编辑:程序博客网 时间:2024/05/18 06:41

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

原创粉丝点击