Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 270|回复: 0

[默认分类] Android的merge标签用法

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-7-9 21:28:32 | 显示全部楼层 |阅读模式

       参考android文档:《Layout Tricks:Merging》



    先得说下关于<merge />标签的第一个比较简单的用法。如果我们使用FrameLayout作为activity"s content view的父元素(也就是在main.xml里把它写在最外层),那么可以考虑用<merge />替换<FrameLayout />标签。官方文档给出的解释是这样做可以减少一级布局层次达到优化布局的效果。这是文档里关于这部分结论的原文,个人E文水平有限,直接贴出来好了:

    Obviously, using <merge /> works in this case because the parent of an activity"s content view is always a FrameLayout. You could not apply this trick if your layout was using a LinearLayout as its root tag for instance.





    关于merge和include标签的使用,直接用实例说明吧。

    TestMergeInclude.java

    public class TestMergeInclude extends Activity {

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    }

    }





    main.xml

    <?xml version="1.0" encoding="utf-8"?>

    <merge

    xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:okCancelBar="http://schemas.android.com/apk/res/test.mergeinclude">



    <ImageView  

    android:layout_width="fill_parent"

    android:layout_height="fill_parent"



    android:scaleType="center"

    android:src="@drawable/wallpaper_rainbokeh" />



    <test.mergeinclude.OkCancelBar

    android:layout_width="fill_parent"

    android:layout_height="wrap_content"

    android:layout_gravity="bottom"



    android:paddingTop="8dip"

    android:gravity="center_horizontal"



    android:background="#AA000000"



    okCancelBar:okLabel="Save"

    okCancelBar:cancelLabel="Don"t save" />

    </merge>





    OkCancelBar.java

    public class OkCancelBar extends LinearLayout {



    public OkCancelBar(Context context) {

    super(context);

    // TODO Auto-generated constructor stub

    }



    public OkCancelBar(Context context, AttributeSet attrs) {

    super(context, attrs);

    // TODO Auto-generated constructor stub



    setOrientation(HORIZONTAL);

    setGravity(Gravity.CENTER);

    setWeightSum(1.0f);



    LayoutInflater.from(context).inflate(R.layout.
    okcancelbar, this, true);



    TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.OkCancelBar, 0, 0);



    String text = array.getString(R.styleable.OkCancelBar_okLabel);

    if(text == null) text = "Ok";

    ((Button)findViewById(R.id.
    okcancelbar_ok)).setText(text);



    text = array.getString(R.styleable.OkCancelBar_cancelLabel);

    if(text == null) text = "Cancel";

    ((Button)findViewById(R.id.
    okcancelbar_cancel)).setText(text);



    array.recycle();

    }

    }






    okcancelbar.xml

    <?xml version="1.0" encoding="utf-8"?>

    <merge xmlns:android="http://schemas.android.com/apk/res/android">

    <include

    layout="@layout/
    okcancelbar_button"

    android:id="@+id/
    okcancelbar_ok" />



    <include

    layout="@layout/
    okcancelbar_button"

    android:id="@+id/
    okcancelbar_cancel" />

    </merge>






    okcancelbar_button.xml

    <?xml version="1.0" encoding="utf-8"?>

    <Button xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"/>





    一点思考:

    1.在OkCancelBar类的构造器中,我们看到一段稍微复杂点儿的代码。其实它们并不难,只是通过ID拿到某个特定的Button引用,然后为其设定要显示出来的文字。与直接使用android:text相比,这种设置要累赘得多。所以不妨把这个累赘看成是为利用<merge />的优点所付出的代价。这个优点就是组件重用,我们只在

    okcancelbar_button.xml文件里声明了一个Button,但在使用时却拥有了两个(当然可以更多)Button。



    2.这里可重用组件(这里的okcancelbar_button)的定义很关键,因为它关联着所有要使用它的功能点。比如:如果你确定在你的应用里,所有使用到这个button的地方需要的显示文字都一样,那你就可以在上面button的定义中再加一个android:text属性,这样就省去了使用时再去逐个设置的麻烦。另外,本例的okcancelbar_button里只定义了一个button,我想这里应该可以扩展到一个布局单元,比如LinearLayout,FrameLayout等等之类的。本人还没尝试,值得一做。



    3.关于使用<merge />标签的一些限制:

    (1)
    它只能作为XML布局声明的root元素来使用;

    (2)
    使用它来inflate一个布局时,必须指定一个ViewGroup实例作为其父元素并且设置attachToRoot属性为true(
    1. 参考 inflate(int, android.view.ViewGroup, boolean)
    复制代码
    方法的说明 )。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-26 18:26 , Processed in 0.404056 second(s), 47 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表