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. В этом сценарии View, указанный в первом параметре inflate(), не присоединен к ViewGroup во втором параметре в данный момент времени.
Вспомните наш предыдущий пример с кнопкой, где мы хотим прикрепить пользовательскую кнопку из файла макета к 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?
Оказывается, даже если мы не сразу добавляем наше новое расширенное представление в его родительскую группу ViewGroup, мы все равно должны использовать LayoutParams родителя, чтобы новый Просмотр, чтобы определить его размер и положение, когда он в конечном итоге будет присоединен.
Ссылка: https://youtu.be/1Y0LlmTCOkM?t=409
person
Utshaw
schedule
26.06.2017