上一篇文章中讲到了Merge的用法和注意事项,所以本人就想,做了一个Demo进行验证下。

一、Merge的使用

(1)activity中的onCreate方法中的setContentView(R.layout.main2);

(2)应用Include或者ViewStub标签从外部导入xml结构时,可以将被导入的xml用merge作为根节点表示,这样当被嵌入父级结构中后可以很好的将它所包含的子集融合到父级结构中,而不会出现冗余的节点。<include layout="@layout/main2"/>

(3)当需要扩充的xml layout本身是由merge作为根节点的话,需要将被导入的xml layout置于 viewGroup中,同时需要设置attachToRoot为True。

View view = inflater.inflate(R.layout.main2, container, true);【注意,Fragment的onCreateView方法中不能使用这个方法,因为ViewGroup container为空】

 二、Merge的注意事项

(1)<merge />只可以作为xml layout的根节点。

(2)如果你所创建的xml layout并不是用FramLayout作为根节点(而是应用LinerLayout等定义root标签),就不能应用上边的例子通过merge来优化UI结构。【merge的布局效果跟FrameLayout是等同的】

(3)Merge的父布局最好也是FrameLayout,因为使用Merge优化是指将<merge />内的元素添加到<merge />的父元素里,如果父布局不是FrameLayout,那么merge的元素添加到父布局中后,本来的展现效果就是发生变化——按照父布局的样式进行展现。

三、验证

MergeDemo的目录如下图所示:

3.1、最初的布局【activity_main.xml】

(1)布局文件

<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.why.mergedemo.activity.MainActivity" > <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="activity_main" /> </RelativeLayout>

activity_main

(2)activity类

package com.why.mergedemo.activity;

import android.app.Activity;
import android.os.Bundle; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} }

MainActivity

(3)HierarchyViewer图(局部)【最左侧的FrameLayout就是指MainActivity的默认布局】

(4)效果图

3.2、用法一:activity中的onCreate方法中的setContentView(R.layout.main2);

3.2.1、activity_oncreate_linear

(1)布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitCenter"
android:src="@drawable/golden_gate" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="20dip"
android:background="#AA000000"
android:padding="12dip"
android:text="activity_oncreate_linear"
android:textColor="#ffffffff" /> </LinearLayout>

activity_oncreate_linear

(2)activity类

package com.why.mergedemo.activity;

import android.app.Activity;
import android.os.Bundle; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_oncreate_linear);
} }

MainActivity

(3)HierarchyViewer图(局部)【最左侧的FrameLayout就是指MainActivity的默认布局】

(4)效果图

3.2.2、activity_oncreate_frame

(1)布局文件

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitXY"
android:src="@drawable/golden_gate" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="20dip"
android:background="#AA000000"
android:padding="12dip"
android:text="activity_oncreate_frame"
android:textColor="#ffffffff" /> </FrameLayout>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitXY"
android:src="@drawable/golden_gate" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="20dip"
android:background="#AA000000"
android:padding="12dip"
android:text="activity_oncreate_frame"
android:textColor="#ffffffff" /> </FrameLayout>

activity_oncreate_frame

(2)activity类

package com.why.mergedemo.activity;

import android.app.Activity;
import android.os.Bundle; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_oncreate_frame);
} }

MainActivity

(3)HierarchyViewer图(局部)【最左侧的FrameLayout就是指MainActivity的默认布局】

(4)效果图

3.2.3、activity_oncreate_merge

(1)布局文件

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <ImageView
android:id="@+id/goldenIv"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="fitXY"
android:src="@drawable/golden_gate" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="20dip"
android:background="#AA000000"
android:padding="12dip"
android:text="activity_oncreate_merge"
android:textColor="#ffffffff" /> </merge>

activity_oncreate_merge

(2)activity类

package com.why.mergedemo.activity;

import android.app.Activity;
import android.os.Bundle; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_oncreate_merge);
} }

MainActivity

(3)HierarchyViewer图(局部)【最左侧的FrameLayout就是指MainActivity的默认布局】

(4)效果图

3.3、用法二:应用Include从外部导入xml结构时

3.3.1、activity_include_frame

(1)布局文件

<LinearLayout 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"
android:orientation="vertical"
tools:context="com.why.mergedemo.activity.MainActivity" > <TextView
android:id="@+id/helloId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="activity_include_frame" /> <include
android:id="@+id/includeId"
layout="@layout/include_frame"/> </LinearLayout>

activity_include_frame

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/golden_gate" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="20dip"
android:background="#AA000000"
android:padding="12dip"
android:text="include_frame"
android:textColor="#ffffffff" /> </FrameLayout>

include_frame

(2)activity类

package com.why.mergedemo.activity;

import android.app.Activity;
import android.os.Bundle; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_include_frame);
} }

MainActivity

(3)HierarchyViewer图(局部)【最左侧的FrameLayout就是指MainActivity的默认布局】

(4)效果图

3.3.2、activity_include_merge

(1)布局文件

<LinearLayout 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"
android:orientation="vertical"
tools:context="com.why.mergedemo.activity.MainActivity" > <TextView
android:id="@+id/helloId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="activity_include_merge" /> <include
android:id="@+id/includeId"
layout="@layout/include_merge"/> </LinearLayout>

activity_include_merge

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/golden_gate" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="20dip"
android:background="#AA000000"
android:padding="12dip"
android:text="include_merge"
android:textColor="#ffffffff" /> </merge>

include_merge

(2)activity类

package com.why.mergedemo.activity;

import android.app.Activity;
import android.os.Bundle; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_include_merge);
} }

MainActivity

(3)HierarchyViewer图(局部)【最左侧的FrameLayout就是指MainActivity的默认布局】

(4)效果图

3.4、用法三:应用inflate从外部导入xml结构时

3.4.1、activity_inflater_customlayout(framelayout--false)

(1)布局文件

<?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="match_parent" > <TextView
android:id="@+id/helloId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="activity_inflater_customlayout" /> <com.why.mergedemo.custom.CustomLinearLayout
android:id="@+id/customLinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/helloId"
android:orientation="vertical"> </com.why.mergedemo.custom.CustomLinearLayout> </RelativeLayout>

activity_inflater_customlayout

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/golden_gate" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="20dip"
android:background="#AA000000"
android:padding="12dip"
android:text="include_frame"
android:textColor="#ffffffff" /> </FrameLayout>

include_frame

(2)activity类

package com.why.mergedemo.activity;

import android.app.Activity;
import android.os.Bundle; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_inflater_customlayout);
} }

MainActivity

package com.why.mergedemo.custom;

import com.why.mergedemo.activity.R;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout; public class CustomLinearLayout extends LinearLayout{ public CustomLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initCustonView(context);
} /*
* inflate(int resource, ViewGroup root, boolean attachToRoot)
* 1. 如果root为null,attachToRoot将失去作用,设置任何值都没有意义。
* 2. 如果root不为null,attachToRoot设为true,则会在加载的布局文件的最外层再嵌套一层root布局。
* 3. 如果root不为null,attachToRoot设为false,则root参数失去作用。
* 4. 在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。*/ public void initCustonView(Context context){
//引入R.layout.include_frame, attachToRoot不能等于true【Caused by: java.lang.StackOverflowError】
//引入R.layout.include_merge, 不能有this.addView(view);
//View view = LayoutInflater.from(context).inflate(R.layout.include_merge, this, true); View view = LayoutInflater.from(context).inflate(R.layout.include_frame, this, false);
this.addView(view);
} }

CustomLinearLayout

(3)HierarchyViewer图(局部)【最左侧的FrameLayout就是指MainActivity的默认布局】

(4)效果图

3.4.2、activity_inflater_customlayout(merge--true)

(1)布局文件

<?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="match_parent" > <TextView
android:id="@+id/helloId"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="activity_inflater_customlayout" /> <com.why.mergedemo.custom.CustomLinearLayout
android:id="@+id/customLinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/helloId"
android:orientation="vertical"> </com.why.mergedemo.custom.CustomLinearLayout> </RelativeLayout>

activity_inflater_customlayout

<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="fitXY"
android:src="@drawable/golden_gate" /> <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|bottom"
android:layout_marginBottom="20dip"
android:background="#AA000000"
android:padding="12dip"
android:text="include_merge"
android:textColor="#ffffffff" /> </merge>

include_merge

(2)activity类

package com.why.mergedemo.activity;

import android.app.Activity;
import android.os.Bundle; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_inflater_customlayout);
} }

MainActivity

package com.why.mergedemo.custom;

import com.why.mergedemo.activity.R;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.LinearLayout; public class CustomLinearLayout extends LinearLayout{ public CustomLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initCustonView(context);
} /*
* inflate(int resource, ViewGroup root, boolean attachToRoot)
* 1. 如果root为null,attachToRoot将失去作用,设置任何值都没有意义。
* 2. 如果root不为null,attachToRoot设为true,则会在加载的布局文件的最外层再嵌套一层root布局。
* 3. 如果root不为null,attachToRoot设为false,则root参数失去作用。
* 4. 在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true。*/ public void initCustonView(Context context){
//引入R.layout.include_frame, attachToRoot不能等于true【Caused by: java.lang.StackOverflowError】
//引入R.layout.include_merge, 不能有this.addView(view);
View view = LayoutInflater.from(context).inflate(R.layout.include_merge, this, true); /*View view = LayoutInflater.from(context).inflate(R.layout.include_frame, this, false);
this.addView(view);*/
} }

CustomLinearLayout

(3)HierarchyViewer图(局部)【最左侧的FrameLayout就是指MainActivity的默认布局】

(4)效果图

关于Merge的整理--Merge的使用方法和注意事项的Demo的更多相关文章

  1. 【hibernate merge】session1.merge(T entity)方法的含义和update方法的区别

    注意:  MERGE语句是SQL语句的一种.在SQL Server.Oracle数据库中可用,MySQL.PostgreSQL中不可用. 1>session1.merge(T entity) 合 ...

  2. Git - Merge: refusing to merge unrelated histories

    场景 我在本地有个代码仓库local-A,本地仓库local-A已经和一个远程仓库remote-A关联了. 接着我又在GitHub上新建了一个仓库remote-B,我希望将本地仓库local-A的本地 ...

  3. Linux任务调度进程crontab的使用方法和注意事项

    参考文章:Linux任务调度进程crond命令的使用方法和注意事项 一.crond简介 概念 crond的概念和crontab是不可分割的.crontab是一个命令,常见于Unix和类Unix的操作系 ...

  4. Swift基础--Swift中的分类以及在分类中扩展init方法的注意事项

    Swift中的分类 1.创建一个空的swift文件 2.关键字extension,格式: extension 要扩展的类名 {} extension UIButton { } Swift中扩展init ...

  5. C++ 开发OCX 的方法和注意事项

    C++ 开发OCX 的方法和注意事项 前言 ActiveX控件是一种实现了一系列特定接口而使其在使用和外观上更象一个控件的COM组件.ActiveX控件这种技术涉及到了几乎所有的COM和OLE的技术精 ...

  6. java字符流操作flush()方法及其注意事项

    java字符流操作flush()方法及其注意事项   flush()方法介绍 查阅文档可以发现,IO流中每一个类都实现了Closeable接口,它们进行资源操作之后都需要执行close()方法将流关闭 ...

  7. Java编程中获取键盘输入实现方法及注意事项

    Java编程中获取键盘输入实现方法及注意事项 1. 键盘输入一个数组 package com.wen201807.sort; import java.util.Scanner; public clas ...

  8. Java中使用方法的注意事项

    Java方法使用的注意事项 本文列举了几个小白在java中使用方法应该注意的几个地方 1. 方法应该定义在类中2.方法中不可以再嵌套方法3.方法定义的前后顺序无所谓4.想要执行方法必须要调用5.如果方 ...

  9. Java基础进阶:继承重点摘要,继承详解,方法重写注意事项,方法重载与重写的区别,抽象类,代码块, 附重难点,代码实现源码,课堂笔记,课后扩展及答案

    继承重点摘要 *继承的特点: 子类在初始化之前,一定要先完成父类数据的初始化 子类在初始化之前,一定要先访问父类构造,完成父类数据的初始化 系统在每一个构造方法中默认隐藏了一句super(); 如果我 ...

随机推荐

  1. Codeforces 599D Spongebob and Squares(数学)

    D. Spongebob and Squares Spongebob is already tired trying to reason his weird actions and calculati ...

  2. HDU 1702 http://acm.hdu.edu.cn/showproblem.php?pid=1702

    #include<stdio.h> #include<string.h> #include<queue> #include<stack> #define ...

  3. srcelement、parentElement

    srcElement 是Dom事件中的事件最初指派到的元素. 比如有一个div,里面有一个按钮.你响应div的onclick事件,但实际上,你单击的只是它内部的按钮,那么,srcElement指向的, ...

  4. Redis安装与调试

    Redis安装与调试 Redis安装与调试linux版本:64位CentOS 6.5 Redis版本:2.8.17  (更新到2014年10月31日) Redis官网:http://redis.io/ ...

  5. MVC神韵---你想在哪解脱!(十)

    增加追加数据的方法和视图 现在我们将要在数据库中追加并保存一些数据.我们将要创建一个表单以及一些表单输入控件,用来输入数据信息.当用户提交表单时将把这些用户输入的信息保存在数据库中.我们可以通过在浏览 ...

  6. Android常用正则工具类

    此类提供日常开发中常用的正则验证函数,比如:邮箱.手机号.电话号码.身份证号码.日期.数字.小数.URL.IP地址等.使用Pattern对象的matches方法进行整个字符匹配,调用该方法相当于:   ...

  7. PostgreSQL的 initdb 源代码分析之二十

    继续分析: setup_privileges(); 展开: 这是设置权限. 其cmd是:"/home/pgsql/project/bin/postgres" --single -F ...

  8. 又来折腾Linux

    硬盘坏了之后就没装过Linux了,因为弄了一个很老的台式机的80G并口硬盘,根本不够用的,一直懒得理. 前段时间实验室的老机子得报销了,但是里面的东西还可以拆下来,所以又拆下了两个硬盘,这样就有三个8 ...

  9. CentOS 6.5安装MySQL中文乱码问题解决

    不管是Linux还是Windows都有新手遇到MySQL服务安装好了之后写入中文发现乱码,今天我装了个CentOS 6.5也遇到了这个问题,现在解决了,分享一下经验. 1.首先安装mysql,我很怕麻 ...

  10. URAL 1779 F - The Great Team 构造

    F - The Great TeamTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest ...