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

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

  • первый в onCreateView(), если я укажу НЕ присоединяться к корню, я получаю ошибку:

    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's parent first.

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

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

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;
}
Другие вопросы по тегам