attachToRoot Встановити значення true:
Якщо функція attachToRoot встановлена в істинне значення, то файл макета, зазначений у першому параметрі, надувається і додається до 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. Наші параметри компонування шануються, оскільки ми знаємо, що кнопка додається до LinearLayout. Тип парамерів макета кнопки повинен бути LinearLayout.LayoutParams.
attachToRoot Встановити значення false (не потрібно використовувати false)
Якщо функція attachToRoot встановлена на false, то файл макета, зазначений у першому параметрі, надутий і не приєднаний до ViewGroup, зазначеної у другому параметрі, але цей завищений вигляд набуває батьківського LayoutParams, що дозволяє цьому представленню правильно відповідати батьківському.
Давайте подивимось, коли ви хочете встановити attachToRoot на false. У цьому сценарії Перегляд, зазначений у першому параметрі inflate (), не приєднаний до ViewGroup у другому параметрі в цей момент часу.
Згадаймо наш приклад Button з попереднього, де ми хочемо приєднати спеціальну кнопку з файлу макета до mLinearLayout. Ми все ще можемо приєднати нашу кнопку до mLinearLayout, передавши помилку false для attachToRoot - ми її просто вручну додаємо потім.
Button button = (Button) inflater.inflate(R.layout.custom_button, mLinearLayout, false);
mLinearLayout.addView(button);
Ці два рядки коду еквівалентні тому, що ми писали раніше в одному рядку коду, коли ми передавали true для attachToRoot. Передаючи помилку, ми говоримо, що поки що не хочемо прикріплювати наш погляд до кореневої ViewGroup. Ми говоримо, що це станеться в якийсь інший момент часу. У цьому прикладі іншим моментом є просто метод addView (), який використовується безпосередньо під інфляцією.
Помилковий приклад attachToRoot вимагає трохи більше роботи, коли ми вручну додаємо View в ViewGroup.
attachToRoot Встановити значення false (обов'язкове хибне значення)
При надуванні та поверненні перегляду фрагмента в onCreateView (), обов'язково переведіть помилку на falseToRoot. Якщо ви перейдете в 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 обробляє додавання перегляду вашого фрагмента до цієї групи перегляду. Ви не хочете прикріплювати її двічі. Встановіть falseToRoot на значення 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?
Виявляється, навіть коли ми не додаємо одразу завищений перегляд до його батьківського ViewGroup, ми все одно повинні використовувати батьківський LayoutParams для того, щоб новий Перегляд визначав його розмір і положення, коли він врешті-решт додається.
Посилання: https://youtu.be/1Y0LlmTCOkM?t=409