2013-05-27 2 views
12

При использовании hierarchy viewer, чтобы уменьшить иерархию, я заметил, что при каждом добавлении фрагмента (как в «статическом», так и «динамическом») фрагменты всегда завернуты в новый FrameLayout.Почему дополнительный 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 создают очень глубокие иерархии, которые, вероятно, плохи для производительности.

Спасибо!

ответ

12

Похоже, вы используете библиотеку поддержки v4 и вы забыли поставить и идентификатор для вашего фрагмента 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. 
*/ 

Могу ли я избавиться от него?

Ну, я думаю, что из трех вариантов:

  1. Вы можете иметь свою собственную реализацию FragmentManager сказать на основе поддержки v4 версии библиотеки, в которой вы опускаете этот контейнер, но я думаю, что усилия написания/поддержания этого кода не стоит, плюс я не думаю, что накладные расходы из-за того, что FrameLayout s является гигантским, если у вас есть проблемы с производительностью, у вас, вероятно, есть другие оптимизации View, чтобы выполнить помимо этого (скажем, написать пользовательский вид, который extends View -) или попросите переосмыслить ваш макет/фрагменты, чтобы уменьшить количество просмотров в иерархии в определенной точке.
  2. Дождитесь новой версии библиотеки поддержки v4 выполняющую 1. < - да я ленивый: D, вы должны сообщить об ошибке, если есть не один уже (см 3.), прохладная часть этого - вы могли бы даже внести свой патч или кого-то еще.
  3. поддержка только платформы (или ждать, пока), где библиотека поддержки v4 не (больше) требуется в уровне API 11+ FragmentManager реализация не имеет этого вложенная ViewGroup (см line 861 of 11+ FragmentManager), на те, которые вы получите что-то вроде этого:

Look mom!, no nested <code>FrameLayout</code>!!1

Я бы не беспокоиться за тех, как я уже говорил есть и другие оптимизации вы можете инвестировать это время в;)

+0

вы сэр - Rock! большое спасибо за исчерпывающий ответ. – Sean

+2

Я открыл для этого проблему: https://code.google.com/p/android/issues/detail?id=68057&thanks=68057&ts=1396459349 – Sean

Смежные вопросы