하나의 뷰에 레이아웃을 부 풀리는 방법


221

XML로 정의 된 레이아웃이 있습니다. 또한 다음을 포함합니다 :

<RelativeLayout
    android:id="@+id/item"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
/>

이 RelativeView를 다른 XML 레이아웃 파일로 팽창시키고 싶습니다. 상황에 따라 다른 레이아웃을 사용할 수 있습니다. 어떻게해야합니까? 나는 다른 변형을 시도했다

RelativeLayout item = (RelativeLayout) findViewById(R.id.item);
item.inflate(...)

그러나 그들 중 누구도 잘 작동하지 않았습니다.

답변:


390

나는 당신의 질문에 따라 확실하지 않습니다-당신은 RelativeLayout에 자식보기를 첨부하려고합니까? 그렇다면 다음 줄을 따라 무언가를 원합니다.

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
item.addView(child);

3
오류가 발생합니다. 02-25 22 : 21 : 19.324 : ERROR / AndroidRuntime (865) : 원인 : java.lang.IllegalStateException : 지정된 자식에 이미 부모가 있습니다. 먼저 자녀의 부모에서 removeView ()를 호출해야합니다.
Michal Dymel 2019

27
방금 이것을 시도해 보았습니다. View child = getLayoutInflater (). inflate (R.layout.child, null);
James

3
문제는 코드가 아닙니다. 코드를 따르는 것은 상당히 쉽습니다. xml 파일을 어디에서 만드나요? 유형이 테마 스타일 자원입니까? 내가 사람들이 포함했다고 생각하는 문제는 우리가이 XML 파일을 어디에 위치
시키는가이다

15
완벽하지 않습니다. 인플레이터의 3 파라미터 버전을 사용해야합니다. 이유는 다음과 같습니다. doubleencore.com/2013/05/layout-inflation-as-intended
Nick Cardoso

3
작동하더라도 대답이 잘못되었습니다. 이 게시물을 확인하십시오 possiblemobile.com/2013/05/layout-inflation-as-intended
ARK

107

XML 리소스를 팽창시킵니다. LayoutInflater 문서를 참조하십시오 .

레이아웃이 mylayout.xml 인 경우 다음과 같은 작업을 수행합니다.

View view; 
LayoutInflater inflater = (LayoutInflater)   getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);

RelativeLayout item = (RelativeLayout) view.findViewById(R.id.item);

4
메인 뷰가 팽창했습니다. 문제는 다른 XML 파일에서 일부를 팽창시키고 싶습니다. 이 항목 RelativeLayout은 더 큰 레이아웃의 일부이며 다른 XML 파일의 레이아웃으로 채우고 싶습니다.
Michal Dymel

. 험 내가 단서 :(이없는 다음 미안 해요 당신이 <포함> 같은 것을 사용하고 기본보기에서 다른 레이아웃을 포함 하는가?
ccheneson

아니요, 간단한 레이아웃입니다. XML없이 프로그래밍 방식으로 요소를 추가 할 것이라고 생각합니다. 도와 줘서 고마워!
Michal Dymel 2019

27

답변이 늦었지만이 방법을 추가하고 싶습니다.

LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = layoutInflater.inflate(R.layout.mylayout, item );

여기서 item당신은 아이의 레이아웃을 추가 할 부모 레이아웃입니다.


(아직도) 귀하의 답변을 이행하는 데 어려움을 겪고 있습니다. 위에서 언급 한 코드를 시도했지만 'item'을 'R.layout.activity_layout'으로 바꿨습니다. " '(int, int)'에 적용 가능한 방법이 없습니다."라는 메시지가 표시됩니다.
Kyle

1
@Kyle-나중에도 여전히. R자원을 객체에 대한 참조로 사용할 수 는 없습니다 int. 당신은 사용할 필요가 findViewById그것을 통과 R리소스를 입력 한 다음 원하는 객체에 캐스팅. 그런 다음과 같은 함수 호출에서 사용할 수 있습니다 inflate. (즉. ViewGroup item = (ViewGroup) findViewById(R.layout.activity_layout);... 그러면 item위와 같이 사용할 수 있습니다 .)
Pimp Trizkit

기본 클래스를 인스턴스화 할 수 없으므로 위의 예제에서 RelativeLayout대신 대신 사용해야한다고 생각합니다 . 5 분 편집 규칙이 있습니다. lolViewGroupViewGroup
Pimp Trizkit

부모를 숨기고 자식보기 만 표시 할 수 있습니까
NovusMobile

감사합니다.이 방법은 조각을 사용하고 있기 때문에 이전 예제에서 getContext ()를 사용할 수없는 위치를 도왔습니다.
RightHandedMonkey

19

이전 게시물이지만 xml에서 부풀려진 자식 뷰를 뷰 그룹 레이아웃에 추가하려는 경우 어떤 유형의 뷰 그룹이 있는지에 대한 힌트로 팽창을 호출해야합니다. 추가 할 수 있습니다. 처럼:

View child = getLayoutInflater().inflate(R.layout.child, item, false);

팽창 방법은 상당히 과부하되어 있으며 문서에서 사용법 의이 부분을 설명합니다. 이 유형의 변경을 수행 할 때까지 XML에서 팽창 된 단일보기가 부모에서 올바르게 정렬되지 않는 문제가있었습니다.


마지막으로 감사합니다 :) 이렇게하면 단일 부모에 여러보기를 추가 할 수 있지만 XML에서 읽은 LayoutParams에 대해 걱정할 필요가 없습니다. 잘 했어!
Sabo

13

더 간단한 방법은 사용하는 것입니다

View child = View.inflate(context, R.layout.child, null)
item.addChild(child) //attach to your item

사용하는 View.inflate()것이 가장 좋은 방법입니다. 불필요 LayoutInflater하거나 전혀 방해가되지 않습니다 getSystemService(Context.LAYOUT_INFLATER_SERVICE)! : D
varun

8

레이아웃 인플레이션

View view = null;
LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
view = inflater.inflate(R.layout.mylayout, null);
main.addView(view);

6

활동이 아닌 경우 클래스 from()에서 정적 메소드를 사용하여 LayoutInflater를 얻 LayoutInflater거나 컨텍스트 메소드에서 서비스를 요청할 수도 getSystemService()있습니다.

LayoutInflater i;
Context x;       //Assuming here that x is a valid context, not null

i = (LayoutInflater) x.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//OR
i = LayoutInflater.from(x);

(거의 4 년 전이지만 여전히 언급 할 가치가 있음을 알고 있습니다)


4

단일보기를 여러 번 추가하려면 다음을 사용해야합니다

   layoutInflaterForButton = getActivity().getLayoutInflater();

 for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
        FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);
        btnContainer.addView(btnView);
    }

당신이 좋아한다면

   layoutInflaterForButton = getActivity().getLayoutInflater();
    FrameLayout btnView = (FrameLayout) layoutInflaterForButton.inflate(R.layout.poll_button, null);

for (int noOfButton = 0; noOfButton < 5; noOfButton++) {
            btnContainer.addView(btnView);
        }

그런 다음 모든 준비된 추가보기를 제외합니다.


4

AttachToRoot를 True로 설정

레이아웃 너비와 레이아웃 높이가 match_parent로 설정된 XML 레이아웃 파일에 버튼을 지정했다고 생각하십시오.

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

이 버튼 클릭 이벤트에서이 활동에 레이아웃을 부풀리기 위해 다음 코드를 설정할 수 있습니다.

LayoutInflater inflater = LayoutInflater.from(getContext());
inflater.inflate(R.layout.yourlayoutname, this);

이 솔루션이 당신에게 도움이 되길 바랍니다.!


3

이 코드를 사용해보십시오 :

  1. 레이아웃을 팽창시키고 싶다면 :

View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,null); // Code for inflating xml layout
RelativeLayout item = view.findViewById(R.id.item);   

  1. 컨테이너 (부모 레이아웃)에 레이아웃을 부 풀리려면 :

LinearLayout parent = findViewById(R.id.container);        //parent layout.
View view = LayoutInflater.from(context).inflate(R.layout.your_xml_layout,parent,false); 
RelativeLayout item = view.findViewById(R.id.item);       //initialize layout & By this you can also perform any event.
parent.addView(view);             //adding your inflated layout in parent layout.


2

내 독특한 상황으로 인해이 오류로 가장 힘든 시간을 보냈지 만 마침내 해결책을 찾았습니다.

내 상황 :을 보유한 별도의보기 (XML)를 사용하고 있으며 주 활동보기에서 버튼을 클릭하면 WebView열립니다 AlertDialog. 그러나 어떻게 든 또는 또 다른는 WebView주요 활동보기 (아마 내가 여기에서 자원을 끌어 때문에), 너무 좋아 내에 할당하기 전에 소유 AlertDialog(뷰로), 내의 부모를 얻어야했다 WebView하는에 넣어 ViewGroup, 그런 다음 해당 뷰를 모두 제거하십시오 ViewGroup. 이것은 효과가 있었고 내 오류는 사라졌습니다.

// set up Alert Dialog box
AlertDialog.Builder alert = new AlertDialog.Builder(this);
// inflate other xml where WebView is
LayoutInflater layoutInflater = (LayoutInflater)this.getSystemService
                (Context.LAYOUT_INFLATER_SERVICE);
View v = layoutInflater.inflate(R.layout.your_webview_layout, null);
final WebView webView = (WebView) v.findViewById(R.id.your_webview_id);

// more code...

.... 나중에로드 한 후 WebView....

// first, remove the parent of WebView from it's old parent so can be assigned a new one.
ViewGroup vg = (ViewGroup) webView.getParent();
vg.removeAllViews();

// put WebView in Dialog box
alert.setView(webView);
alert.show();

2

자식 뷰를 RelativeLayout에 첨부하려고하십니까? 당신은 다음과 같이 할 수 있습니다

RelativeLayout item = (RelativeLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, item, true);

1

Kotlin을 사용하면 다음을 사용할 수 있습니다.

val content = LayoutInflater.from(context).inflate(R.layout.[custom_layout_name], null)

[your_main_layout].apply {
    //..
    addView(content)
}

-1

나는 이것을 위해 아래 코드 스 니펫을 사용했고 그것은 나를 위해 일했다.

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.item);
View child = getLayoutInflater().inflate(R.layout.child, null);
linearLayout.addView(child);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.