转载:http://hi.baidu.com/lck0502/blog/item/f22a1b13dccde8def6039ea4.html
参考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"/> attrs.xml//有些文章没有加,编译不过 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="OkCancelBar"> <attr name="okLabel" format="string" /> <attr name="cancelLabel" format="string" /> </declare-styleable> </resources>
一点思考:
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(参考 inflate(int, android.view.ViewGroup, boolean)
方法的说明 )。
相关推荐
在实际应用中,`include`和`merge`常常结合使用,以实现高效的布局重用并保持良好的性能。正确地使用这两个标签可以显著提升开发效率,减少代码重复,同时还能优化应用的运行性能。因此,理解并熟练运用`include`和`...
总结来说,`include`和`merge`是Android布局设计中的强大工具,通过合理使用它们,开发者可以创建更灵活、高效且易于维护的布局结构。理解并熟练掌握这两个标签的使用,对于提升Android应用的用户体验和开发效率具有...
`include`和`merge`标签是Android XML布局文件中两个非常重要的元素,它们帮助开发者实现布局的重用和优化,提高代码的可维护性和效率。接下来,我们将深入探讨这两个标记的区别和使用方法。 ### `include`标签 `...
当我们需要在多个布局中复用一部分视图时,可以使用`<include>`标签来引用一个包含`merge`的布局文件。这样,被引用的视图会直接插入到`include`的位置,而不是创建一个新的层级。 ```xml <!-- reusable_layout....
通过合理地使用`<include />`和`<merge>`,以及结合其他技术如Data Binding,我们可以构建出更加高效、灵活的用户界面。在实际开发中,要根据项目需求灵活运用这些技巧,以提升应用的性能和用户体验。
在Android开发中,`<include>`和`<merge>`标签是两种非常重要的布局组合工具,它们可以帮助开发者提高代码复用性,减少布局嵌套,从而优化应用性能和UI设计。让我们深入探讨这两种标签的使用方法及其优化布局的作用...
merge结合include优化android布局,效果不知道,个人感觉使用上也有很大的局限,不过还是了解一下,记录下来。 布局文件都要有根节点,但android中的布局嵌套过多会造成性能问题,于是在使用include嵌套的时候我们...
综上所述,`merge`布局是Android UI开发中的一个重要工具,它有助于提升性能,简化代码,尤其是在使用Genymotion等高性能模拟器进行测试和调试时。熟练掌握`merge`布局的使用,对于提升应用的用户体验和开发效率具有...
为了高效复用完整布局,你可以使用<include>和<merge>标签嵌入另一个布局到当前布局。所以当你通过写一个自定义视图创建独立UI组件,你可以放到一个布局文件里,这样更容易复用。 复用布局因为其允许你创建可复用的...
- 当merge作为`<include>`的子元素时,`<include>`的属性(如`android:layout_width`、`android:layout_height`)将应用于merge的子视图,而不是merge本身。 - 为了避免混淆,避免在同一个布局文件中同时使用merge和...
这个项目可能包括了主布局文件、子布局文件以及相应的Java代码,用于演示`include`标签的使用和功能。 总之,熟练掌握`include`标签的使用能够极大地提高Android应用的开发效率和代码质量。正确地应用`include`标签...
在Android开发中,`<include>`标签是一种布局重用机制,它允许开发者将一个布局文件嵌入到另一个布局文件中,极大地提高了代码的可维护性和复用性。本篇文章将详细探讨`<include>`标签的使用方法、应用场景以及注意...
在实际开发中,结合使用`<include>`、`<merge>`和`ViewStub`,我们可以有效地组织和优化布局,提高应用的性能和用户体验。通过合理利用这些工具,可以避免过度的视图嵌套,减少内存消耗,同时保持代码的整洁和可维护...
Android官方提供了一些工具来优化布局管理,包括`include`、`merge`和`ViewStub`标签。这三个标签分别在不同的场景下发挥着重要作用,提高了代码的可读性和效率。 ### 1. `include`标签 `include`标签允许开发者将...
在Android开发中,为了提高代码复用性和优化布局性能,Android提供了三种特殊的抽象布局:`<include/>`、`<merge/>` 和 `<ViewStub/>`。这些布局元素都有各自的特性和用途,使得开发者能够更好地管理和优化应用的...
此外,`<include>`标签还可以与其他布局组件如`<merge>`、`<LinearLayout>`、`<RelativeLayout>`等配合使用,以实现更复杂的布局结构。例如,如果你希望将`<include>`标签作为某个布局的一部分,你可以将其放入一个`...