在使用hierarchy viewer来减少层次结构时,我注意到在每次添加 fragment 时(以“静态”或“动态”方式), fragment 始终包裹在和新的FrameLayout 中。

这是一个示例:

这是我的 Activity 布局:

<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>

这是 fragment 布局:
<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之外, Activity 源代码为空,
fragment 源代码仅包含
@Override
public View onCreateView(...) {
    return inflater.inflate(R.layout.fragment_main, container, false);
}

现在,

我希望直接在 Activity 根目录的层次结构中看到PrograssBar,但是相反,还有一个我不知道它来自何处的附加FrameLayout。
这是一个屏幕截图,以黄色绘制了额外的帧:

因此,我的问题是-它是从哪里来的?我可以摆脱它吗?
在我的实际应用程序中,那些多余的FrameLayouts创建了非常深的层次结构,这可能对性能不利。

谢谢!

最佳答案

似乎您正在使用支持v4库,并且忘记了将id和ID放入 fragment xml标签中:),所以​​:



它来自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.
 */



好吧,我可以想到三个选择:
  • 您可以基于支持v4库版本有一个自己的FragmentManager实现,在该版本中省略了此容器,但是我认为编写/维护该代码的工作是不值得的,而且我不认为这些FrameLayout会导致开销s是巨大的,如果您遇到性能问题,则除此以外,您可能还需要执行其他View优化(例如,编写自定义 View -哪个extends View-),或者说重新考虑您的布局/fragment 以减少层次结构中特定点的 View 数量。
  • 等待新的支持v4库完成1。这就是您甚至可以贡献您的补丁或其他人。
  • 仅在不需要(更长)支持v4库的平台上(或等待直到),在API级别11+中,FragmentManager实现没有嵌套的ViewGroup(请参阅line 861 of 11+ FragmentManager ),在您得到类似以下内容的平台上:


  • 我为那些人担心的不多,正如我提到的,您可以在这段时间里投入其他优化;)

    10-06 06:32