我的FrameLayout
包含TextView
和两个LinearLayout
:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
... a textview and 2 linearlayouts
</FrameLayout>
运行Android Lint后,我收到此警告:This <FrameLayout> can be replaced with a <merge> tag.
为什么会出现此警告?我该怎么做才能解决它(除了忽略)?
答案 0 :(得分:28)
要理解这一点,您需要了解布局如何膨胀和放置。
比方说,您有一个活动,这是您使用的布局xml。以下是在放置布局文件之前活动的布局。
<FrameLayout // This is the window
...
<FrameLayout> // This is activity
</FrameLayout>
</FrameLayout>
可能还有一些其他图层,具体取决于设备/操作系统。
现在,当您为布局文件充气并将其放入时,这就是它的外观。
<FrameLayout // This is the window
...
<FrameLayout> // This is activity
// Your layout below
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
... a textview and 2 linearlayouts
</FrameLayout>
</FrameLayout>
</FrameLayout>
你在FrameLayout中看到FrameLayout吗?拥有它是多余的,因为它没有增加太多价值。要进行优化,您可以使用&lt;来替换FrameLayout。合并&gt;。如果你使用,这就是它的样子。
<FrameLayout // This is the window
...
<FrameLayout // This is activity
// Your layout below
... a textview and 2 linearlayouts
</FrameLayout>
</FrameLayout>
注意没有额外的FrameLayout。相反,它只是与活动的FrameLayout合并。只要你可以,你应该使用&lt;合并&gt;。这不仅适用于FrameLayouts。你可以在这里读更多关于它的内容。 http://developer.android.com/training/improving-layouts/reusing-layouts.html#Merge
希望这有帮助。
答案 1 :(得分:8)
您是否将此作为活动的主要布局?如果是这样,您可以将其替换为合并标记,如下所示:
<merge xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >
... a textview and 2 linearlayouts
</merge>
在setContentView
,Android会获取合并代码的子代,并直接将其插入FrameLayout
@android:id/content
。使用FrameLayout
检查这两种方法(merge
与HierarachyViewer
)以查看差异。
答案 2 :(得分:1)
有关详细信息,请参阅Romain Guy的this帖子。它告诉您为什么建议合并选项。
答案 3 :(得分:0)
要在设备中呈现XML,请分阶段执行一个过程,第一个过程是 Measure 。
测量:在此阶段,父母及其子女的大小以及 他们的孩子,等等。因此,您的CPU会扫描所有 布局中的ViewGroup和View来衡量它们的大小。有时候 原因,由于以下原因,可能需要递归进行此扫描: 父母和子女的大小相互依赖。
那为什么Lint会发出此警告?
因为您的XML最终将被加载到包含FrameLayout的窗口中,并且在XML文件中,您还使用了FrameLayout,所以最终您的XML将被放置在 窗口的FrameLayout如下所示:
<FrameLayout> <!--belongs to window-->
<FrameLayout> <!--belongs to your XML-->
...
</FrameLayout>
</FrameLayout>
现在,在测量阶段,CPU的开销很大,无法同时测量FrameLayout
。如果我们能够以某种方式设法在XML中使用外部FrameLayout
,那么可以克服这种开销,这完全可以通过merge
标签来实现。