attachToRoot Установите в true:
Если для attachToRoot установлено значение true, то файл макета, указанный в первом параметре, раздувается и присоединяется к ViewGroup, указанной во втором параметре.
Представьте, что мы указали кнопку в файле макета XML с шириной макета и высотой макета, равными match_parent.
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/custom_button">
</Button>
Теперь мы хотим программно добавить эту кнопку в LinearLayout внутри фрагмента или действия. Если наш LinearLayout уже является переменной-членом mLinearLayout, мы можем просто добавить кнопку со следующим:
inflater.inflate(R.layout.custom_button, mLinearLayout, true);
Мы указали, что хотим накачать кнопку из файла ресурсов макета; Затем мы сообщаем LayoutInflater, что хотим присоединить его к mLinearLayout. Наши параметры макета соблюдаются, потому что мы знаем, что Button добавляется в LinearLayout. Тип параметров макета кнопки должен быть LinearLayout.LayoutParams.
attachToRoot Установите в false (не обязательно использовать false)
Если для attachToRoot установлено значение false, то файл макета, указанный в первом параметре, раздувается и не присоединяется к ViewGroup, указанной во втором параметре, но это раздутое представление получает родительский объект LayoutParams, который позволяет этому представлению правильно вписаться в родительский объект .
Давайте посмотрим, когда вы захотите установить для attachToRoot значение false. В этом случае представление, указанное в первом параметре inflate (), не прикреплено к ViewGroup во втором параметре в данный момент времени.
Вспомните наш пример Button из предыдущего, где мы хотим прикрепить пользовательскую кнопку Button из файла макета к mLinearLayout. Мы по-прежнему можем присоединить нашу кнопку к mLinearLayout, передав false для attachToRoot - мы просто вручную добавим его самостоятельно.
Button button = (Button) inflater.inflate(R.layout.custom_button, mLinearLayout, false);
mLinearLayout.addView(button);
Эти две строки кода эквивалентны тому, что мы написали ранее в одной строке кода, когда мы передали true для attachToRoot. Передавая false, мы говорим, что пока не хотим присоединять наш View к корневой ViewGroup. Мы говорим, что это произойдет в другой момент времени. В этом примере другим моментом времени является просто метод addView (), который используется сразу после инфляции.
Ложный пример attachToRoot требует немного больше работы, когда мы вручную добавляем View в ViewGroup.
attachToRoot Устанавливается в false (false является обязательным).
Когда надувать и возвращать представление фрагмента в onCreateView (), обязательно передайте false для attachToRoot. Если вы передадите значение true, вы получите исключение IllegalStateException, поскольку указанный дочерний элемент уже имеет родителя. Вы должны были указать, где ваш фрагмент будет возвращен в вашу активность. FragmentManager является задачей добавления, удаления и замены фрагментов.
FragmentManager fragmentManager = getSupportFragmentManager();
Fragment fragment = fragmentManager.findFragmentById(R.id.root_viewGroup);
if (fragment == null) {
fragment = new MainFragment();
fragmentManager.beginTransaction()
.add(R.id.root_viewGroup, fragment)
.commit();
}
Контейнер root_viewGroup, в котором будет храниться ваш фрагмент в вашей активности, - это параметр ViewGroup, данный вам в onCreateView () вашего фрагмента. Это также ViewGroup, которую вы передаете в LayoutInflater.inflate (). Однако FragmentManager будет обрабатывать присоединение вашего фрагмента к этой ViewGroup. Вы не хотите прикрепить его дважды. Установите attachToRoot в false.
public View onCreateView(LayoutInflater inflater, ViewGroup parentViewGroup, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout, parentViewGroup, false);
…
return view;
}
Почему нам в первую очередь предоставляется родительская ViewGroup нашего фрагмента, если мы не хотим присоединять ее в onCreateView ()? Почему метод inflate () запрашивает корневую ViewGroup?
Оказывается, что даже когда мы не сразу добавляем наш недавно надутый View к его родительской ViewGroup, мы все равно должны использовать LayoutParams родителя, чтобы новый View определял его размер и положение всякий раз, когда он в конечном итоге присоединяется.
Ссылка: https://youtu.be/1Y0LlmTCOkM?t=409