programing

LayoutInflater attachToRoot 매개변수는 무엇을 의미합니까?

codeshow 2023. 9. 9. 10:20
반응형

LayoutInflater attachToRoot 매개변수는 무엇을 의미합니까?

그 문서는 내게 그 목적에 대해 정확히 알지는 못합니다.attachToRoot매개 변수.

attachToRoot: 부풀려진 계층 구조를 루트 매개 변수에 연결할지 여부.false인 경우 root은 XML에서 root 보기에 대한 LayoutParams의 올바른 하위 클래스를 만드는 데만 사용됩니다.

, 가 가 인지 해 요 요 해 가 가 그리고 아마도 그들 사이의 행동 변화의 예를 보여 줄 수 있을 것입니다.true그리고.false가치관?

지금 또는 지금 안 함

"세 번째" 매개 변수 attachToRoot가 true 또는 false인 주요 차이점은 다음과 같습니다.

attachToRoot를 넣을 때

true : 자식 보기를 부모 RIGHT NOW에 추가합니다.
false: 자식 보기를 부모 NOT NOW에 추가합니다.
나중에 추가합니다. '

그게 언제 더 늦습니까?

그것은 나중에 당신이 eg를 사용할 때입니다.parent.addView(childView)

일반적인 오해는 attachToRoot 매개 변수가 false인 경우 하위 보기가 상위 보기에 추가되지 않는다는 입니다.틀렸습니다
두 경우 모두 자식 보기가 parentView에 추가됩니다.그것은 단지 시간문제입니다.

inflater.inflate(child,parent,false);
parent.addView(child);   

와 동치입니다.

inflater.inflate(child,parent,true);

노 노 노 노
하위 보기를 상위 보기에 추가할 책임이 없는 경우 attachToRoot를 true로 전달해서는 안 됩니다.
fragment 추가 시을 :할때예

public View onCreateView(LayoutInflater inflater,ViewGroup parent,Bundle bundle)
  {
        super.onCreateView(inflater,parent,bundle);
        View view = inflater.inflate(R.layout.image_fragment,parent,false);
        .....
        return view;
  }

세번째 파라미터를 true로 통과하면 이 사람 때문에 LegalState Exception.

getSupportFragmentManager()
      .beginTransaction()
      .add(parent, childFragment)
      .commit();

실수로 이미 onCreateView()에 하위 조각을 추가했으므로 add를 호출하면 하위 보기가 상위 These LegalStateException에 이미 추가되었음을 알 수 있습니다.
여기서는 childView를 추가할 책임이 없으며 FragmentManager가 책임집니다.그러니 이 경우에는 항상 거짓으로 넘어가세요.

참고: attachToRoot가 false인 경우 parentView에서 childView touchEvents를 가져오지 않는다는 내용도 읽었습니다.하지만 저는 테스트를 해보지 않았습니다.

때두에 child로 됩니다. true는 두 번째 매개 변수입니다.를 들어, 매개 어를개인가우 aaer인as가r어t를LinearLayout그러면 부풀려진 보기가 자동으로 해당 보기의 하위 항목으로 추가됩니다.

거짓으로 설정되면 레이아웃이 부풀려지지만 다른 레이아웃에는 첨부되지 않습니다(그려지지 않도록 하거나 터치 이벤트 수신 등).

응답에는 많은 텍스트가 있지만 코드는 없는 것 같습니다. 그래서 사람들이 언급한 몇 가지 응답에서 코드 예제를 사용하여 이 오래된 질문을 되살리기로 결정했습니다.

true로 설정하면 레이아웃이 부풀려질 때 자동으로 두 번째 매개변수에 하위로 지정된 ViewGroup의 뷰 계층에 추가됩니다.

코드에서 실제로 의미하는 바는 다음과 같습니다(대부분의 프로그래머들이 이해하는 바).

public class MyCustomLayout extends LinearLayout {
    public MyCustomLayout(Context context) {
        super(context);
        // Inflate the view from the layout resource and pass it as child of mine (Notice I'm a LinearLayout class).

        LayoutInflater.from(context).inflate(R.layout.child_view, this, true);
    }
}

가 을 하고 하고 R.layout.child_view으로서의 MyCustomLayout에 때문에attachToRoot매개변수는true를가는과히은로다웃치은다ifdesyeenesg의ytser웃ft를d과치하는addView프로그래밍 방식으로 또는 xml에서 이 작업을 수행한 것처럼:

<LinearLayout>
   <View.../>
   ...
</LinearLayout>

는 Δ Δ Δ Δ Δ Δ 통과 시 시나리오를 설명합니다.attachRoot~하듯이false:

LinearLayout linearLayout = new LinearLayout(context);
linearLayout.setLayoutParams(new LayoutParams(
    LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
linearLayout.setOrientation(LinearLayout.VERTICAL);
    // Create a stand-alone view
View myView = LayoutInflater.from(context)
    .inflate(R.layout.ownRootView, null, false);
linearLayout.addView(myView);

에서 에서 를 했습니다 했습니다 를 에서 myView트고지기해에는을다의로가게다ef의tto을dsd는t'e의,의 일부로 추가했습니다.LinearLayout잠시 동안은 (부모가 없는) 독립적인 시각이었습니다.

Fragments에서도 마찬가지로 기존 그룹에 추가하여 그룹의 일부가 되거나 매개 변수를 전달할 수 있습니다.

inflater.inflate(R.layout.fragment, null, false);

자신의 루트가 될 것임을 명시하는 것입니다.

서류와 이전 답변 두 개면 충분할 것 같아요, 저의 몇 가지 생각뿐입니다.

inflatemethod는 레이아웃 파일을 부풀리는 데 사용됩니다..ViewGroup또는 해당 레이아웃 파일에서 뷰 계층을 부풀리고 일반 뷰 계층 외부에서 작업합니다.

는 .attachToRoot과이야다개를lo야oerte개과를true(또는 매우 단순하게 사용합니다.inflate 루트를 일및위를는드드는웃dast를일및위eaViewGroup(비)(비)null이 ( )) 이 경우.View히입니다.ViewGroup그로다다,dendts그e은다. 방법ViewGroup확장된 뷰 계층 구조가 추가될 위치입니다.

반환된 의 된 된 View는근근estViewGroup레이아웃 파일에서.만약 당신이 쌍 질문에서 우리의 마지막 논의를 기억한다면 이것이 그 이유 중 하나입니다.merge의 제한에 의 된 이 의 된 이 merge게고면,a,attachedToRoot를 설정해야 합니다.true). a)가 루트가 a인 레이아웃 파일이 있는 경우merge를 달고attachedToRoot로 설정되었습니다.false그 다음에inflate는할이다다이s할odeln merge그에 상응하는 것이 없습니다.또한,나와 있는 처럼,한,에,,inflate 있는 버전attachToRoot으로 설정합니다false는 정확한로들수기에다을뷰eyh다wseuenett기뷰을수한LayoutParams부모로부터이것은 어떤 경우에 중요한데, 가장 주목할 만한 것은 아이들입니다.AdapterView, 의 의 하위 클래스ViewGroup, 에 에 addView()메서드 집합이 지원되지 않습니다.이 선을 사용한 것을 기억하실 겁니다.getView()방법:

convertView = inflater.inflate(R.layout.row_layout, parent, false);

된 은 된 를 합니다 를 합니다 된 을 합니다.R.layout.row_layout합니다가 .LayoutParamsAdapterView는 해당 된위스에스위된nViewGroup가 a일 레이아웃 수 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .RelativeLayout.TableLayout/TableRow한 것들을 가지고 있습니다.고한다이한다이eeol한.LayoutParams은의이다지야enee야dets고지은duLayoutParams.

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" />

주 활동.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로 설정되어 있기 때문에 메인 액티비티 레이아웃에 버튼 레이아웃이 추가되지 않기 때문입니다.

Linear Layout에는 뷰를 Linear Layout에 추가하는 데 사용할 수 있는 addView(뷰 보기) 메서드가 있습니다.이렇게 하면 기본 활동 레이아웃에 버튼 레이아웃이 추가되고 코드를 실행할 때 버튼이 표시됩니다.

root.addView(view);

이전 줄을 제거하고 attachToRoot를 true로 설정하면 어떻게 되는지 알아보겠습니다.

View view = inflater.inflate(R.layout.button, root, true);

버튼 레이아웃이 보이는 것을 다시 확인할 수 있습니다.이는 attachToRoot가 팽창된 레이아웃을 지정된 상위 레이아웃에 직접 연결하기 때문입니다.이 경우 루트 선형 레이아웃입니다.여기서는 addView(View) 메서드를 사용하여 이전의 경우처럼 수동으로 뷰를 추가할 필요가 없습니다.

attachToRoot를 프래그먼트에 참으로 설정할 때 사용자가 불법 상태 예외를 받는 이유는 무엇입니까?

이는 조각의 경우 활동 파일에서 조각 레이아웃을 배치할 위치를 이미 지정했기 때문입니다.

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
    .add(R.id.root, fragment)
    .commit();

add(부모, Fragment fragment)는 자신의 레이아웃이 있는 fragment를 부모 레이아웃에 추가합니다.attachToRoot를 true로 설정하면 다음과 같은 LegalStateException이 발생합니다.지정한 자식에게 부모가 이미 있습니다.fragment layout은 add() 메서드에서 이미 상위 레이아웃에 추가되어 있습니다.

프래그먼트를 부풀릴 때는 항상 attachToRoot에 대해 false를 전달해야 합니다.Fragments를 추가, 제거 및 교체하는 것은 Fragment Manager의 작업입니다.

다시 예를 들어보겠습니다.둘 다 하면 어떨까요?

View view = inflater.inflate(R.layout.button, root, true);
root.addView(view);

첫 번째 행에서 LayoutInflater는 버튼 레이아웃을 루트 레이아웃에 부착하고 동일한 버튼 레이아웃을 유지하는 View 객체를 반환합니다.두 번째 줄에서는 상위 루트 레이아웃에 동일한 View 개체를 추가합니다.그러면 Fragments에서 본 것과 동일한 LegalStateException이 발생합니다(지정한 하위에 이미 부모가 있음).

기본적으로 attachToRoot를 true로 설정하는 또 다른 오버로드된 infloat() 메서드가 있습니다.

View inflate (int resource, ViewGroup root)

나 자신 또한 무엇이 진짜 목적인지 혼란스러웠습니다.attachToRoot인에inflate의 연구 끝에 UI에 대한 약간의 연구 끝에 마침내 답을 얻었습니다.

부모:

이 경우 findViewById()를 사용하여 부풀릴 뷰 객체를 둘러싸는 위젯/레이아웃입니다.

attachToRoot:

는 뷰를 부모 뷰에 첨부하므로 뷰가 받는 터치 이벤트도 부모 뷰로 전송됩니다. 이제 이벤트를 즐길지 무시할지는 부모에게 달려 있습니다. false로 설정하면 부모의 직접 자식으로 추가되지 않고 부모는 보기에서 터치 이벤트를 수신하지 않습니다.

이것이 혼란을 없애주기를 바랍니다.

인플레() 방법에 대한 문서화로 인해 이 주제에 대해 많은 혼란이 있습니다.

일반적으로 attachToRoot가 true로 설정된 경우 첫 번째 매개 변수에 지정된 레이아웃 파일이 부풀려진 후 그 시점에 두 번째 매개 변수에 지정된 ViewGroup에 첨부됩니다.attachToRoot가 false인 경우 첫 번째 매개변수의 레이아웃 파일이 View로 부풀려져 반환되고 View 첨부 파일은 다른 시간에 발생합니다.

예를 많이 보지 않는 한 이것은 큰 의미가 없을 것입니다.Fragment의 onCreateView 메서드 안에서 LayoutInflater.inflate()를 호출할 때 해당 Fragment와 관련된 Activity가 실제로 해당 Fragment의 뷰를 추가하는 역할을 하므로 attachToRoot에 대해 false를 전달할 수 있습니다.addView() 메서드와 같이 특정 시점에 수동으로 뷰를 부풀려서 다른 뷰에 추가하는 경우 첨부 파일이 이후 시점에 제공되므로 attachToRoot에 대해 false를 전달할 수 있습니다.

이 주제에 대해 제가 작성한 블로그 게시물에서 대화상자 및 사용자 정의 보기와 관련된 몇 가지 다른 독특한 예를 읽을 수 있습니다.

https://www.bignerdranch.com/blog/understanding-androids-layoutinflater-inflate/

attachToRoot참으로 설정하면 다음을 의미합니다.inflatedView가 상위 보기의 계층에 추가됩니다.따라서 사용자에 의해 터치 이벤트(또는 기타 UI 작업)를 "보여지고" 감지할 수 있습니다.그렇지 않으면 생성된 것일 뿐 보기 계층에 추가되지 않으므로 터치 이벤트를 보거나 처리할 수 없습니다.

iOS , ① iOS, ②attachToRoot는 이 true 라고 은 true 입니다.

[parent addSubview:inflatedView];

더 멀리 가면 다음과 같은 질문을 할 수 있습니다.우위야는유유는i할yfidt야우위를 i>attachToRootfalse가 일부 매개 변수 부모 를입니다. 이는 XML 트리의 루트 요소가 일부 레이아웃 매개변수(부모 일치와 같은)를 계산하기 위해 상위 보기가 필요하기 때문입니다.

상위 항목을 정의하면 attachToRoot는 인플레이터가 상위 항목에 실제로 연결할지 여부를 결정합니다.ListAdapter의 경우와 같이 목록이 보기를 목록에 추가하려고 하지만 이미 첨부되어 있다고 표시되기 때문에 예외가 발생하는 경우도 있습니다.다른 경우에는 보기를 직접 부풀려서 활동에 추가하는 것이 편리하고 코드 줄을 저장할 수 있습니다.

를 들면 우리는 를, 있습니다.ImageView ,aLinearLayout그리고.RelativeLayout입니다. 선형 배치는 상대 배치의 자식입니다.계층 구조 보기 다음과 같습니다 는 같습니다 다음과 view hierarchy 는 . . 같습니다

RelativeLayout
           ------->LinearLayout

ImageView를 위한 별도의 레이아웃 파일이 있습니다.

image_view_graphics.xml

루트에 연결:

//here container is the LinearLayout

    View v = Inflater.Inflate(R.layout.image_view_layout,container,true);
  1. 여기 v에는 컨테이너 레이아웃(Linear Layout)의 기준이 포함됩니다.그리고 만약 당신이 다음과 같은 파라미터를 설정하고 싶다면.setImageResource(R.drawable.np); 찾아야 합니다. 즉, ImageView의 합니다.view.findById()
  2. v의 상위 항목은 FrameLayout이 됩니다.
  3. LayoutParams는 FrameLayout이 됩니다.

루트에 연결 안 함:

//here container is the LinearLayout
    View v = Inflater.Inflate(R.layout.image_view_layout,container,false);
  1. 에는 기준 v 에는 과 된 ImageView(이미지뷰) 되지 되어 이 가 인 를 할 되어 이 에는 과 view.setImageResource(R.drawable.np);등의 언급 없이findViewById 그러나 컨테이너는 ImageView가 컨테이너의 LayoutParams를 가져오도록 지정되어 있으므로 컨테이너의 참조는 LayoutParams만을 위한 것이라고 할 수 있습니다.
  2. 따라서 특히 부모는 null이 됩니다.
  3. LayoutParams는 LinearLayout이 됩니다.

ToRoot Set를 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이 이미 멤버 변수인 mLinearLayout이면 다음과 같이 버튼을 추가할 수 있습니다.

inflater.inflate(R.layout.custom_button, mLinearLayout, true);

우리는 버튼을 레이아웃 리소스 파일에서 부풀리기로 지정했습니다. ③ Layout Inflater ④ mLinear Layout ⑤ .Linear Layout(선형 레이아웃)에 버튼이 추가된다는 것을 알고 있기 때문에 레이아웃 매개변수를 지정할 수 있습니다.단추의 레이아웃 매개변수 유형은 선형 레이아웃이어야 합니다.배치 매개변수.

ToRootSet을 false에 첨부(false를 사용하는 데 필요하지 않음)

attachToRoot가 false로 설정된 경우 첫 번째 매개 변수에 지정된 레이아웃 파일이 확장되고 두 번째 매개 변수에 지정된 ViewGroup에 첨부되지 않지만 확장된 는 해당 뷰를 상위에 정확하게 맞출 수 있는 상위의 LayoutParams를 획득합니다.


attachToRoot를 false로 설정할 시기에 대해 알아보겠습니다.이 시나리오에서는 inflate()의 첫 번째 파라미터에 지정된 View가 현재 시점에서 두 번째 파라미터의 ViewGroup에 연결되지 않습니다.

레이아웃 파일에서 사용자 정의 버튼을 mLinearLayout에 첨부하고자 하는 이전의 버튼 예제를 상기합니다.attachToRoot에 대해 false를 전달하여 Button to LinearLayout을 연결할 수 있습니다. 나중에 수동으로 추가할 뿐입니다.

Button button = (Button) inflater.inflate(R.layout.custom_button,    mLinearLayout, false);
mLinearLayout.addView(button);

이 두 줄의 코드는 앞서 attachToRoot에 대해 true를 전달할 때 한 줄의 코드에서 작성한 것과 동일합니다.false를 전달함으로써 아직 루트 ViewGroup에 View를 연결하고 싶지 않다고 말합니다.우리는 그것이 다른 시점에 일어날 것이라고 말하고 있습니다.이 예제에서 다른 시점은 인플레이션 바로 아래에 사용되는 addView() 방법입니다.

false attachToRoot 예제는 View를 View Group에 수동으로 추가할 때 약간의 작업이 필요합니다.

is false (false) ToRoot Set (false )

CreateView() 에서 Fragment's View 부풀려 반환할 때는 대해 attachToRoot 를 false 전달해야 합니다 에 를 합니다 전달해야 create 를 대해 false fragment view ) 에서 ( to attach 부풀려true가 이미 합니다.활동에서 조각 보기를 다시 배치할 위치를 지정해야 합니다.Fragments를 추가, 제거 및 교체하는 것은 Fragment Manager의 작업입니다.

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 컨테이너는 프래그먼트의 CreateView()에 주어진 ViewGroup 매개변수입니다.또한 LayoutInflater.flate()에 전달하는 ViewGroup입니다.그러나 Fragment Manager는 이 ViewGroup에 Fragment's View를 연결하는 작업을 처리합니다.당신은 그것을 두 번 붙이기를 원하지 않습니다.attachToRoot를 false로 설정합니다.

public View onCreateView(LayoutInflater inflater, ViewGroup  parentViewGroup, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_layout,     parentViewGroup, false);
…
return view;
}

CreateView() 에 Fragment 상위 ViewGroup 첨부하지 않으려면 처음부터 왜 의 상위 합니까 부여해야 을 을 의 ? create 합니까 group 부여해야 view 상위 을 fragment view ) ?inflopped는 무엇입니까?가 rootViewGroup는까는을까?는y는aes(ttw)d

새로 부풀려진 View를 상위 View Group에 즉시 추가하지 않더라도 새 View가 최종적으로 부착될 때마다 크기와 위치를 결정할 수 있도록 상위 View의 LayoutParams를 사용해야 하는 것으로 나타났습니다.

링크: https://youtu.be/1Y0LlmTCOkM?t=409

이 주제를 다루면서 접했던 몇 가지 점들을 공유하는 것 뿐입니다.

저는 수락된 답변 외에도 도움이 될 수 있는 몇 가지 사항을 원합니다.

따라서 attachToRoot를 true로 사용했을 때 반환된 뷰는 ViewGroup 유형, 즉 부모의 rootViewGroup으로 infloat(layoutResource, ViewGroup, attachToRoot) 메서드에 대한 매개 변수로 전달되었습니다. 전달된 레이아웃 유형이 아니라 attachToRoot에서 false로 전달된 뷰 유형입니다. layoutResource의 rootViewGroup의 함수 반환 유형을 가져옵니다.

예를 들어 설명하겠습니다.

Linear Layoutroot 레이아웃으로 설정한 후 infloat 기능을 통해 TextView를 추가하고자 합니다.

그런 다음 attachToRoot를 true infloat 함수로 사용하면 View of type LinearLayout이 반환됩니다.

attachToRoot를 false infloat 함수로 사용하는 동안 TextView 유형보기를 반환합니다.

이 발견이 도움이 되기를...

언급URL : https://stackoverflow.com/questions/12567578/what-does-the-layoutinflater-attachtoroot-parameter-mean

반응형