활동하지 않는 장소에서 getLayoutInflater ()를 호출


190

무엇을 가져와야하거나 활동 이외의 장소에서 레이아웃 팽창기를 어떻게 호출 할 수 있습니까?

public static void method(Context context){
    //this doesn't work the getLayoutInflater method could not be found
    LayoutInflater inflater = getLayoutInflater();
    // this also doesn't work 
    LayoutInflater inflater = context.getLayoutInflater();
}

getLayoutInflater활동 중에 만 전화 할 수 있는데 , 이것이 제한입니까? 사용자 정의 대화 상자를 생성하고 뷰를 부풀 리거나 서비스에서 표시되는 사용자 정의 뷰가있는 토스트 메시지를 받으려면 서비스의 컨텍스트 만 있고 활동이 없습니다. 하지만 맞춤 메시지를 표시하고 싶습니다.

액티비티 클래스에없는 코드의 장소에 팽창기가 필요합니다.

어떻게해야합니까?

답변:


396

이 외부 활동을 사용할 수 있습니다. 필요한 것은 Context다음과 같습니다.

LayoutInflater inflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );

그런 다음 다른 위젯을 검색하려면 레이아웃을 부풀립니다.

View view = inflater.inflate( R.layout.myNewInflatedLayout, null );
Button myButton = (Button) view.findViewById( R.id.myButton );

2014 년 7 월 현재 수정

를 얻는 방법에 대한 Davide의 대답LayoutInflater 은 실제로 내 것보다 정확합니다 (아직 유효합니다).


좋아요, 그러나 이제 findViewById가 작동하지 않습니다. 그것에 대해 어떤 아이디어가 있습니까? inflater.inflate (R.layout.some_layout, (ViewGroup) findViewById (R.id.parent));
Lukap

nop, inflater.inflate () 메소드는 하나의 int 매개 변수로 메소드에 과부하가 걸리지 않았지만 다음 메소드는 null 일 수 있습니다.
Lukap

@kaspermoerch 왜 David의 대답이 더 정확하다고 말했습니까?
Rohan Bhatia

1
@RohanBhatia Davides의 답변은 광산에서 캐스팅을 요구하지 않습니다. getSystemService(아마도) 어떤 이유로 호출 이 유형의 객체를 반환하지 않으면 LayoutInflater내 코드에서 런타임 예외가 발생합니다.
kaspermoerch

나를 위해 일했다. 감사합니다
CodeFluid

261

아니면 ...

LayoutInflater inflater = LayoutInflater.from(context);

5
아주 늦었지만 실제로 from 함수가 더 팽창기를 돌려서 오류를 발생시키는 지 assert로 확인하면 더 나은 대답입니다. 코드의 어딘가에서 null 포인터 예외를 처리하는 것이 훨씬 쉽습니다. grepcode.com/file/repository.grepcode.com/java/ext/…
Raanan

38
그래서 간단한, 많은 인플레이터
Danyal Aytekin

@Davide이 인용은 kaspermoerch의 솔루션이 당신보다 낫다는 것을 의미합니까? "직접 사용되지 않습니다. 대신 getLayoutInflater () 또는 getSystemService (Class)를 사용하여 현재 컨텍스트에 이미 연결되어 있고 현재 실행중인 장치에 대해 올바르게 구성된 표준 LayoutInflater 인스턴스를 검색하십시오." developer.android.com/reference/android/view/LayoutInflater
Tamás Bolvári

@ TamásBolvári 더 쉽고 명확합니다. 실제로 내부 구현은 Kaspermoerch 쓰기와 동일합니다.
Davide

11

또는

View.inflate(context, layout, parent)


괜찮아 ; 그러나이 방법으로는 부울 "attachToRoot"를 제공 할 수 없습니다
DenisGL

attachToRoot가 필요하지 않은 경우 요구 사항을 기반으로하며 편리한 도우미 메서드이거나 getRootView ()를 부모의 메서드로 전달합니다.
Prakash Nadar

9

컨텍스트 객체를 사용하면 다음 코드에서 LayoutInflater를 얻을 수 있습니다.

LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

1
LayoutInflater.from(context).inflate(R.layout.row_payment_gateway_item, null);

1
코드와 함께 설명 텍스트를 제공하는 것이 좋습니다.
HansHirse

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.