Jef*_*rod 7 code-reuse android include android-layout
作为这个问题的后续内容,我想不出有什么理由不能将每个包含的XML布局包装成一<merge>对.
这让我想知道,为什么ADT团队没有将此作为默认行为?
有没有人不想要这种行为?
顺便提一下,标签的Android文档中的解释<merge>比最糟糕的法律协议中的措辞更糟糕:
<merge />在一个布局中包含一个布局时,该标记有助于消除视图层次结构中的冗余视图组.例如,如果主布局是一个垂直LinearLayout,其中两个连续视图可以在多个布局中重复使用,则放置两个视图的可重用布局需要自己的根视图.但是,使用另一个LinearLayout作为可重用布局的根将导致垂直LinearLayout内部的垂直LinearLayout.嵌套LinearLayout除了降低UI性能之外没有任何其他用途.
罗曼,你在哪里?
include标记的主要目的(我看到它的方式)是允许开发人员创建可重用的xml组件,以便在同一活动中多次使用或/和应用程序中的许多活动.为了使该可重用组件真正有用,它需要是自包含的并且具有尽可能少的外部连接.从我的角度来看,如果你merge在每个包含的布局中使用标签,这将降低整个include标签的有用性.以下是我认为会发生这种情况的一个例子:
考虑您要实现可重用的ActionBarxml组件以嵌入您的每个活动中.它将包含a TextView和a Button水平放置.执行此操作的布局将是:
R.layout.actionbar
<?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="wrap_content" >
<TextView
android:id="@+id/actionbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/actionbar_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
现在假设您的应用中有两个活动,一个是根视图LinearLayout(垂直方向),另一个是根视图RelativeLayout.上面的布局可以很容易地包含在LinearLayout(只是把它放在你想要的地方),同样可以使用RelativeLayout,当然考虑到当前的元素RelativeLayout(请记住你必须设置layout_width/height(例如,复制)从包含的布局的根目录中为include标记,以便layout_*考虑其他属性).
现在考虑你的提议.布局将变为:
<merge xmlns:android="http://schemas.android.com/apk/res/android" >
<TextView
android:id="@+id/actionbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<Button
android:id="@+id/actionbar_action"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</merge>
Run Code Online (Sandbox Code Playgroud)
看看我们的ActionBar布局并没有告诉我们那么多,你只需要一个TextView和一个Button被包含在某个地方.现在考虑根是垂直方向的活动LinearLayout.布局R.layout.actionbar不能简单地包含在内,因为这会打破我们的布局ActionBar,我们需要LinearLayout为布局添加额外的(水平方向)以使其看起来像所需.你可以看到你处于上面的情况(没有merge标签的布局),但是现在你必须记住将包含的布局包装在一个LinearLayout水平方向,其中父根是一个LinearLayout方向垂直.
当root是a时RelativeLayout,事情变得更糟,你不能简单地在一个include标签merge中使用RelativeLayout(一个很好的问题来阅读如何让RelativeLayout使用merge和include?).再一次,该选项可以嵌入到include一个LinearLayout没有merge标记的情况下(但现在添加的问题多于解决问题).另请阅读此链接的最后一部分http://code.google.com/p/android/issues/detail?id=2863可能会显示include标记中的其他错误.
正如您在上面的示例中所看到的merge,默认情况下使用标记可能会在某些情况下导致某些问题.此外,当前系统表示使用布局的更一致的方式(您将为include标签创建布局,就像您使用根创建普通布局一样View).此外,merge标签是一种优化,我不认为你应该尝试优化,直到你开始看到一些性能问题(或者你真的想要以复杂性为代价挤压每一滴性能).大多数应用程序都适用于当前系统,具有相当数量的视图的三层四层深度布局可以在没有merge优化的情况下生存而没有任何问题.
merge标签的另一个问题是,在充气时merge 需要将其自身附加到父级的膨胀布局.如果您要扩充R.layout.actionbar布局,那么您必须将其附加到父级:
View actionBar = getLayoutInflater().inflate(R.layout.actionbar, root, true);
Run Code Online (Sandbox Code Playgroud)
我不知道这是否是一个真正的限制,也许在极少数情况下它可能是一个交易破坏者.
只是我对include- merge对使用的看法.
| 归档时间: |
|
| 查看次数: |
2763 次 |
| 最近记录: |