为什么要为片段创建额外的FrameLayout?

时间:2013-05-27 13:55:37

标签: android performance view android-fragments

在使用hierarchy viewer以减少层次结构时,我注意到每次添加片段时(都在"静态"或"动态"方式)片段始终包含在新的FrameLayout 中。

以下是一个例子:

这是我的活动布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:contentDescription="mainActivityRoot" >

<TextView
    android:id="@+id/hello_world"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello_world" />

<fragment
    android:name="com.example.testfragments.MainFragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@id/hello_world" />

</RelativeLayout>

这是片段布局

<ProgressBar android:id="@+id/ProgressBar1" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:contentDescription="mainFragmentRoot"
android:layout_height="match_parent" />

除了setContentView之外,活动源代码为空, 片段源代码仅包含

@Override
public View onCreateView(...) {
    return inflater.inflate(R.layout.fragment_main, container, false);
}

现在,

我希望在活动根目录的层次结构中直接看到PrograssBar,但是还有一个额外的FrameLayout,我不知道它来自哪里。 这是一个屏幕截图,在黄色中绘制了额外的框架: Dump view hierarchy - yellow is bad

所以,我的问题是 - 它来自哪里?我可以摆脱它吗? 在我的实际应用程序中,那些额外的FrameLayouts正在创建非常深层次的层次结构,这可能对性能有害。

谢谢!

1 个答案:

答案 0 :(得分:12)

好像你正在使用支持v4库而你忘了把你的片段xml标签放入和id :),所以:

  

它来自哪里?

它来自line 888 of FragmentManager,您可以在其中看到:

f.mView = NoSaveStateFrameLayout.wrap(f.mView);

这样做的原因是向后兼容性,NoSaveStateFrameLayout的评论标题更好地说明了这一点:

/**
 * Pre-Honeycomb versions of the platform don't have {@link View#setSaveFromParentEnabled(boolean)},
 * so instead we insert this between the view and its parent.
 */
  

我可以摆脱它吗?

好吧,我可以想到三个选择:

  1. 您可以根据支持v4库版本说明您自己的FragmentManager实现,其中您省略了这个容器,但我认为编写/维护该代码的努力是不值得的,而且我不是认为那些FrameLayout的开销是巨大的,如果你遇到性能问题,你可能还需要进行其他View优化(比如写一个自定义视图 - extends View - )或者说重新考虑你的布局/片段,以减少层次结构中某一点的观看量。
  2. 等待支持v4库的新版本完成 1。&lt; - 是的我是一个懒人:D,如果没有bug,你必须提交一个bug (参见 3。),这个很酷的部分是你甚至可以贡献你的补丁或其他人。
  3. 仅支持需要(更长)支持v4库的平台(或等待),在API级别11 + FragmentManager实现中没有此嵌套ViewGroup(请参阅line 861 of 11+ FragmentManager }),对于那些你得到这样的东西:
  4. Look mom!, no nested <code>FrameLayout</code>!!1

    我不会担心那些,因为我提到有其他优化你可以投入那些时间;)