关于Merge的整理--Merge的使用方法和注意事项的Demo

上一篇文章中讲到了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)效果图

时间: 2024-11-08 21:57:20

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

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

1>session1.merge(T entity) 合并实体的方法. 2>merge的作用是:新new一个对象,如果该对象设置了ID,则这个对象就当作游离态处理:                                       当ID在数据库中不能找到时,用update的话肯定会报异常,然而用merge的话,就会insert.                                       当ID在数据库中能找到的时候,update与merge的执行效果都是更新数据,

JS知识整理之 Call&amp;Apply方法

JavaScript中的函数也是对象,和其他JS对象一样也可以包含方法,其中Call和Apply就是其中比较重要的方法,可以用来间接的调用函数.这两个方法允许显式制定调用所需的this值,也就是说所有函数可以作为任何对象的方法来使用,哪怕这个函数不是那个对象的方法. Call方法: 语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) Apply方法: 语法:apply([thisObj[,argArray]]) Call和Apply方法作用相同,但从以

[git] git merge 和 git merge --no-ff

git merge 和 git merge --no-ff 根据这张图片可以看出 git merge –no-ff 可以保存你之前的分支历史.能够更好的查看 merge历史,以及branch 状态. git merge 则不会显示 feature,只保留单条分支记录 一时间没看明白: git merge效果: git merge –no-ff效果 附录: https://segmentfault.com/q/1010000002477106 sourcetree使用教程: http://blog

微信公众平台群发消息的方法及注意事项

群发消息的方法 操作方法:登录微信公众平台(https://mp.weixin.qq.com)=>群发消息=>根据需要填写文字/语音/图片/视频/录音等内容后,选择对群发对象.性别.群发地区发送即可. 群发消息内容 目前支持群发的内容:文字.语音.图片.视频.图文消息. 1.群发内容中需添加文字+图片+视频,可先在“素材管理”中设置图文消息,然后群发时选择“图文消息”类型即可. 2.上传至素材管理中的图片.语音可多次群发,没有有效期. 3.群发图文消息的标题上限为64个字节: 4.群发内容字数

EGOImageView的使用方法及注意事项

1.下载EGOImageView及其相关的类库 EGOImageLoading 将EGOCache.EGOImageButton.EGOImageView.EGOImageLoader全部添加到工程下(拷贝) 2.EGOImagView使用代码如下 [plain] view plaincopy EGOImageView *imageView = [[EGOImageView alloc] initWithPlaceholderImage:[UIImage imageNamed:@"placeho

Dubbo+zookeeper使用方法以及注意事项

Dubbo+zookeeper使用方法以及注意事项 最近在一个项目中想做一个数据库查询的服务,目的是将数据库查询这块从程序中脱离出来,形成一个公共的服务平台,大家都可以调用,经过考虑决定选用Dubbo+zookeeper这个经典的组合来实现,以下记录我事件中遇上的问题,希望大家可以借鉴,同时对自己也是一种备忘吧! 1.对应的包下载: 基本就是Spring的包+zookeeper的包+dubbo的包 生产部分配置如下 <?xml version="1.0" encoding=&qu

3.3 方法的注意事项

/* 方法的注意事项: A:方法不调用不执行 B:方法与方法是平级关系,不能嵌套定义 C:方法定义的时候参数之间用逗号隔开 D:方法调用的时候不用在传递数据类型 E:如果方法有明确的返回值,一定要有return带回一个值 */ class FunctionDemo2 { public static void main(String[] args) { /* 错误的 public static int sum(int a,int b){ return a + b; } */ //sum(10,20

使用OpenSSL工具制作X.509证书的方法及其注意事项总结

如何使用OpenSSL工具生成根证书与应用证书 本文由CSDN-蚍蜉撼青松 [主页:http://blog.csdn.net/howeverpf]原创,转载请注明出处! 一.步骤简记 // 生成顶级CA的公钥证书和私钥文件,有效期10年(RSA 1024bits,默认) openssl req -new -x509 -days 3650 -keyout CARoot1024.key -out CARoot1024.crt // 为顶级CA的私钥文件去除保护口令 openssl rsa -in C

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

C++ 开发OCX 的方法和注意事项 前言 ActiveX控件是一种实现了一系列特定接口而使其在使用和外观上更象一个控件的COM组件.ActiveX控件这种技术涉及到了几乎所有的COM和OLE的技术精华,如可链接对象.统一数据传输.OLE文档.属性页.永久存储以及OLE自动化等. ActiveX控件作为基本的界面单元,必须拥有自己的属性和方法以适合不同特点的程序和向包容器程序提供功能服务,其属性和方法均由自动化服务的 IDispatch接口来支持.除了属性和方法外,ActiveX控件还具有区别于