이 답변은 여러 StackOverflow 페이지를 거친 후에도 attachToRoot의 의미를 명확하게 파악할 수 없었기 때문에 작성되었습니다. 아래는 LayoutInflater 클래스의 inflate () 메서드입니다.
View inflate (int resource, ViewGroup root, boolean attachToRoot)
activity_main.xml 파일, button.xml 레이아웃 및 내가 만든 MainActivity.java 파일을 살펴보십시오 .
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
</LinearLayout>
button.xml
<Button xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
MainActivity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LayoutInflater inflater = getLayoutInflater();
LinearLayout root = (LinearLayout) findViewById(R.id.root);
View view = inflater.inflate(R.layout.button, root, false);
}
코드를 실행하면 레이아웃에 버튼이 표시되지 않습니다. attachToRoot가 false로 설정되어 있기 때문에 버튼 레이아웃이 기본 활동 레이아웃에 추가되지 않기 때문입니다.
LinearLayout에는 LinearLayout 에 뷰를 추가하는 데 사용할 수 있는 addView (View view) 메소드가 있습니다. 이렇게하면 버튼 레이아웃이 기본 활동 레이아웃에 추가되고 코드를 실행할 때 버튼이 표시됩니다.
root.addView(view);
이전 행을 제거하고 attachToRoot를 true로 설정하면 어떻게되는지 봅시다.
View view = inflater.inflate(R.layout.button, root, true);
다시 버튼 레이아웃이 보입니다. attachToRoot가 팽창 된 레이아웃을 지정된 상위에 직접 첨부하기 때문입니다. 이 경우 루트 LinearLayout입니다. addView (View view) 메소드로 이전과 같이 수동으로 뷰를 추가 할 필요가 없습니다.
Fragment에 대해 attachToRoot를 true로 설정할 때 사람들이 IllegalStateException을 얻는 이유는 무엇입니까?
조각의 경우 활동 파일에서 조각 레이아웃을 배치 할 위치를 이미 지정했기 때문입니다.
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.add(R.id.root, fragment)
.commit();
추가 (INT 부모, 조각 조각은) 부모 레이아웃에 그것의 레이아웃이 조각을 추가합니다. attachToRoot를 true로 설정하면 IllegalStateException이 발생합니다. 지정된 자식에 이미 부모가 있습니다. add () 메서드에서 조각 레이아웃이 이미 부모 레이아웃에 추가 되었기 때문에
프래그먼트를 부 풀릴 때 attachToRoot에 대해 항상 false를 전달해야합니다. FragmentManager를 추가, 제거 및 교체하는 것은 FragmentManager의 작업입니다.
내 예로 돌아 가기 우리 둘 다하면 어떡해?
View view = inflater.inflate(R.layout.button, root, true);
root.addView(view);
첫 번째 줄에서 LayoutInflater는 버튼 레이아웃을 루트 레이아웃에 연결하고 동일한 버튼 레이아웃을 보유하는 View 객체를 반환합니다. 두 번째 줄에서는 부모 뷰에 동일한 View 객체를 추가합니다. 결과적으로 Fragments와 동일한 IllegalStateException이 발생합니다 (지정된 자식에는 이미 부모가 있습니다).
기본적으로 attachToRoot를 true로 설정하는 또 다른 오버로드 된 inflate () 메소드가 있습니다.
View inflate (int resource, ViewGroup root)