活動していない場所でのgetLayoutInflater()の呼び出し


189

インポートする必要があるもの、またはアクティビティ以外の場所でレイアウトインフレーターを呼び出すにはどうすればよいですか?

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、2011年

いいえ、inflater.inflate()メソッドには1つのint paramだけでオーバーロードされたメソッドはありませんが、次のメソッドはnullになる可能性があります。
Lukap、2011年

@kaspermoerchなぜあなたはデビッドの答えがより正しいと言ったのですか?
Rohan Bhatia

1
@RohanBhatia Davidesの回答は、私の行うキャストを必要としません。getSystemServiceなんらかの理由でへの呼び出しがタイプのオブジェクトを返さないLayoutInflater場合、私のコードはランタイム例外を引き起こします。
kaspermoerch

私のために働いた。ありがとう
CodeFluid

260

または...

LayoutInflater inflater = LayoutInflater.from(context);

5
非常に遅いですが、実際にはより良い答えです。from関数は、実際にインフレーターを元に戻し、それ以外の場合はエラーをスローすることもアサートで確認するためです。これにより、コードのどこかでnullポインターの例外を処理するのがはるかに簡単になります。grepcode.com/file/repository.grepcode.com/java/ext/...
Raanan

38
非常に簡潔で非常にインフレーター
Danyal Aytekin 2014

@Davideこの引用は、kaspermoerchのソリューションがあなたのソリューションより優れていることを意味しますか?「直接使用されることはありません。代わりに、getLayoutInflater()またはgetSystemService(Class)を使用して、現在のコンテキストにすでに接続され、実行中のデバイス用に正しく構成されている標準のLayoutInflaterインスタンスを取得してください。」developer.android.com/reference/android/view/LayoutInflater
タマシュ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);


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.