使用dagger 2的java视图依赖项注入 6 月,2 周 Questions & Answers 7640 我有一个扩展TextView的自定义视图。我应该在哪里调用我的组件来注入视图 component.inject(customTextView);
# 1 楼答案 更新:由于Dagger的2.10版本,此答案无效 自定义视图: public class CustomView extends View { @Inject AnyObject anyObject; public CustomView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { super.onFinishInflate(); MainActivity mainActivity = (MainActivity) getContext(); mainActivity.getComponent().inject(CustomView.this); } } 活动: ActivityComponent mComponent; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mComponent = DaggerActivityComponent.builder() .appComponent(getApp().getAppComponent()) .activityModule(new ActivityModule(MainActivity.this)) .build(); mComponent.inject(MainActivity.this); ... } public ActivityComponent getComponent() { return mComponent; } 具有活动范围的Dagger2组件: @ActivityScope @Component(dependencies = AppComponent.class, modules = {ActivityModule.class}) public interface ActivityComponent extends AppComponent { void inject(MainActivity mainActivity); void inject(CustomView customView); } 范围: @Scope @Retention(RetentionPolicy.RUNTIME) public @interface ActivityScope {}
# 2 楼答案 我对这类事情的一般解决方案是 public class WelcomeView extends LinearLayout { private static final String TAG = "WelcomeView"; public WelcomeView(Context context) { super(context); init(context); } public WelcomeView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public WelcomeView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } @TargetApi(21) public WelcomeView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(context); } private void init(Context context) { if(!isInEditMode()) { Application.getComponent(context).inject(this); } }
# 3 楼答案 因此,我发现我需要在自定义视图的构造函数中添加注入(在所有视图中,或者一个调用另一个) 例如: public class CustomTextView extends TextView { @Inject AnyProvider anyProvider; public CustomTextView(Context context) { this(context, null); } public CustomTextView(Context AttributeSet attrs) { super(context, attrs); Application.getComponent(context).inject(this); } }
# 1 楼答案
更新:由于Dagger的2.10版本,此答案无效
自定义视图:
活动:
具有活动范围的Dagger2组件:
范围:
# 2 楼答案
我对这类事情的一般解决方案是
# 3 楼答案
因此,我发现我需要在自定义视图的构造函数中添加注入(在所有视图中,或者一个调用另一个)
例如: