13

在使用层次结构查看器来减少层次结构时,我注意到在每次添加片段时(以“静态”或“动态”方式),片段总是被包裹在一个新的 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 ,我不知道它来自哪里。这是一个屏幕截图,用黄色绘制了额外的框架: 转储视图层次结构 - 黄色不好

所以,我的问题是——它是从哪里来的?我可以摆脱它吗? 在我的实际应用程序中,那些额外的 FrameLayout 会创建非常深的层次结构,这可能对性能不利。

谢谢!

4

1 回答 1

12

似乎您正在使用支持 v4 库,而您忘记将 id 放入片段 xml 标记:),所以:

它从哪里来的?

它来自FragmentManager 的第 888 行,您可以在其中看到:

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. 你可以有你自己的FragmentManager基于支持 v4 库版本的 say 实现,在其中你省略了这个容器,但我认为编写/维护该代码的努力是不值得的,而且我不认为这些FrameLayouts 的开销是巨大的,如果您遇到性能问题,您可能还View需要执行其他优化(比如编写自定义视图 -which extends View-),或者说重新考虑您的布局/片段以在某个点减少层次结构中的视图数量。
  2. 等待完成1的支持 v4 库的新版本。 <-是的,我是一个懒惰的人 :D,如果还没有一个错误,你将不得不提交一个错误(见3.),这很酷的部分你甚至可以贡献你的补丁或其他人。
  3. 仅支持不需要(更长)支持 v4 库的平台(或等到),在 API 级别 11+FragmentManager实现中没有此嵌套ViewGroup(请参阅11+ 的第 861 行FragmentManager),在那些你得到这样的东西上:

看妈妈!,没有嵌套的<code>FrameLayout</code>!!1

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

于 2013-05-27T17:09:03.470 回答