Activity
次のように、Android で Dagger を使用して、のインスタンスを別のクラスに挿入したいと考えています。
class PresentationLayer{
Activity mActivity;
@Inject
public PresentationLayer(Activity activity){
this.mActivity = activity;
}
public void presentData(User user){
((TextView)mActivity.findViewById(R.id.username))
.setText(user.getName());
//...
//...
}
}
注入はできますが、 のすべてのフィールドはActivity
注入null
時です。
私が注射をしている方法は次のとおりです。
MyActivity
はそれ自体がモジュールです。
@Module(
complete = false
)
class MainActivity extends Activity{
@Override
public void onCreate(Bundle bundle){
super.onCreate(bundle);
setContentView(R.layout.main_activity);
ObjectGraph objectGraph = CustomApplication.getObjectGraph();
PresentationLayer pres = objectGraph.get(PresentationLayer.class);
}
@Provides Activity provideActivity(){
return this;
}
}
これは私のメインモジュールです
@Module(
entryPoints = PresentationLayer.class,
includes = MainActivity.class
)
class DaggerModule{
@Provides PresentationLayer providePresentation(Activity activity){
return new PresentationLayer(activity);
}
}
そして、Application
オブジェクト グラフをブートストラップするクラスです。
class CustomApplication extends Application{
private static ObjectGraph sObjectGraph;
@Override
public void onCreate(){
sObjectGraph = ObjectGraph.create(new DaggerModule());
}
static getObjectGraph(){
return sObjectGraph;
}
}
を呼び出した後setContentView
、明示的に注入を実行する方法を探しています。
どうすればこれを行うことができますか?
編集1:
このように動作するようになりましたが、これが「正しい方法」であるかどうかはわかりません。私がすることは
- Activity を
Module
コンストラクターに渡す - 適切なインスタンスが に渡されるように、実行
ObjectGraph
後にをビルドするようにしてください。setContentView()
Activity
ObjectGraph
私Activity
はもはや短剣ではありませんModule
。
これは、コードで次のように変換されます。
@Module(
entryPoints = PresentationLayer.class
)
class DaggerModule{
private Activity mActivity;
public DaggerModule (Activity activity){
this.mActivity = activity;
}
@Provides PresentationLayer providePresentation(){
return new PresentationLayer(mActivity);
}
}
そして、これが私のActivity
見た目です:
class MainActivity extends Activity{
@Override
public void onCreate(Bundle bundle){
super.onCreate(bundle);
setContentView(R.layout.main_activity);
ObjectGraph objectGraph = CustomApplication.getObjectGraph(this);
PresentationLayer pres = objectGraph.get(PresentationLayer.class);
User user = //get the user here
pres.presentData(user);
}
}
このソリューションは、この回答で Jesse Wilson によって提起されたポイントに対処しているようです。ただし、が作成されるたびObjectGraph
に がビルドされるため、パフォーマンスが心配です。Activity
何かご意見は?