在使用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.
*/
好吧,我可以想到三个选择:
FragmentManager
实现,在该版本中省略了此容器,但是我认为编写/维护该代码的工作是不值得的,而且我不认为这些FrameLayout
会导致开销s是巨大的,如果您遇到性能问题,则除此以外,您可能还需要执行其他View
优化(例如,编写自定义 View -哪个extends View
-),或者说重新考虑您的布局/fragment 以减少层次结构中特定点的 View 数量。 FragmentManager
实现没有嵌套的ViewGroup
(请参阅line 861 of 11+ FragmentManager
),在您得到类似以下内容的平台上:我为那些人担心的不多,正如我提到的,您可以在这段时间里投入其他优化;)