警告:此<framelayout>可以替换为<merge>标记</merge> </framelayout>

时间:2014-01-31 19:02:19

标签: android xml android-framelayout android-lint

我的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.

为什么会出现此警告?我该怎么做才能解决它(除了忽略)?

4 个答案:

答案 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检查这两种方法(mergeHierarachyViewer)以查看差异。

答案 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标签来实现。