2016-09-21 1 views
4

DaggerによってLayoutInflaterへのリンクを挿入し、LayoutInflater.from(application);のようなアプリケーションコンテキストからモジュールで生成することがあります。これはコード行を減らします。インフレータにはアクティビティのコンテキストが必要ですか?

しかし、大学が、それは間違った方法であることを教え、そしてそれは本当ですLayoutInflater.from(MainActivity.this);

でActivityコンテキストから指定する必要があり?レイアウトインフレータの動作はコンテキストのタイプに依存しますか?

答えて

0

servicesのようにあなたが自由に使う可能性のある他のコンテクストよりも長く生きるかもしれないもののためにコンテクストが必要であることがわかったら、getApplicationContext()を使うことができます。

ですので、長時間または地球規模で保持するオブジェクトを必要としない場合はactivity contextを使用することをお勧めします。

希望すると助かります。

+0

はい、ありがとうございます。しかし、質問はLayoutInflaterに関するものでした。アプリケーションコンテキストから生成されたLayoutInflaterを使用すると、UIに違いはありますか? – tse

+0

あなたはいません。したがって、より良いメモリ管理のためにアクティビティコンテキストを使用してください。 – KDeogharkar

1

私が正しく理解している場合、LayoutInflaterを作成するためのアプリケーションコンテキストを使用する場合は、テーマ設定を失う可能性があります。 more詳細はこちらをご覧ください。

source code of layout inflaterから

を更新しました:あなたが見ることができるように、(あなたのケースのアプリケーションのコンテキストで)あなたのコンテキストはビューの構成に渡し

Object[] args = mConstructorArgs; 
args[1] = attrs; 

constructor.setAccessible(true); 
final View view = constructor.newInstance(args); 
if (view instanceof ViewStub) { 
    // Use the same context when inflating ViewStub later. 
    final ViewStub viewStub = (ViewStub) view; 
    viewStub.setLayoutInflater(cloneInContext((Context) args[0])); 
} 
return view; 

。つまり、ビューの範囲はアクティビティではなくアプリケーションになります。

2

はい、該当します。スタイルを考えると大きな違いがあります。

LayoutInflaterは、コンストラクタを呼び出してビューを作成します。そこに渡されたコンテキストが渡されます。したがって、アクティビティコンテキストの代わりにアプリケーションコンテキストを使用すると、情報が不足する可能性があります。

ビューを直接作成するためにアプリケーションコンテキストを使用するのと同じ問題です。アクティビティによって異なるスタイルが定義され、そのコンテキストがこれらの情報をラップします。

どのように入手できるかを考慮すると、大きな違いはありません。内部的にはLayoutInflater.cloneInContext(Context)が呼び出され、異なるコンテキスト設定が適用されます。

既存のLayoutInflaterオブジェクトのコピーを作成し、そのコピーは元のものと異なるContextを指します。これはContextThemeWrapperによって新しいLayoutInflaterを作成し、新しいContextテーマと一緒に使用されます。

アプリケーションコンテキストでは、これを取得しません。

1

アプリケーションコンテキストが意味する場合、インフレータインスタンスは、アプリケーションが終了するまでアプリケーション全体に存在します。それ以外の場合、アクティビティコンテキストを使用すると、アクティビティが破棄されるとインフレータインスタンスが削除されます。

関連する問題