Подтвердить что ты не робот

Можете ли вы использовать тег слияния с фрагментами?

Если я использую тег merge как родительский тег для макета фрагмента, у меня возникают две проблемы:

  • сначала, в onCreateView(), если я укажу NOT для присоединения к корню, я получаю ошибку:

    android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true

  • и если я присоединяюсь к root, я получаю ошибку:

    java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child parent first.

Я нашел хороший ответ на другой вопрос здесь, говоря, что библиотека фрагментов автоматически присоединяет ребенка к группе родительского представления, которую вы указываете при замене. Было высказано предположение, что вам нужно было установить attachToRoot на false. Для тега merge это необходимо.

Можно ли обойти любое из этих правил для использования тега merge для макета фрагмента?

4b9b3361

Ответ 1

Можно ли обойти любое из этих правил, чтобы использовать слияние тег для макета фрагмента?

Нет. Как вы уже видели, когда вы раздуваете файл макета с тегом merge в качестве своего корня, вы должны прикреплять его к допустимому родительскому элементу ViewGroup. Прикрепление его к контейнеру в onCreateView неверно, так как View, возвращаемый этим методом, будет добавлен каркасом.

Вы всегда можете создать макет оболочки в методе onCreateView, с помощью которого можно подключить раздутый макет (и вернуть этот макет оболочки), но это сделает оптимизацию тегов merge бесполезной, поскольку вы можете добавить макет оболочки в файле макета xml с самого начала:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
     LinearLayout wrapper = new LinearLayout(getActivity()); // for example
     inflater.inflate(R.layout.layout_with_merge_as_root, wrapper, true);
     return wrapper;
}