Android 匕首2继承活动和碎片
我在我的应用程序中使用了dagger 2,我得到了这个错误 我有基本活动:Android 匕首2继承活动和碎片,android,dependency-injection,dagger-2,Android,Dependency Injection,Dagger 2,我在我的应用程序中使用了dagger 2,我得到了这个错误 我有基本活动: public abstract class QuestionBaseActivity extends DaggerAppCompatActivity implements View.OnClickListener { protected QuestionViewPager questionsViewPager; protected TabLayout questionTabs; protected ProgressBa
public abstract class QuestionBaseActivity extends DaggerAppCompatActivity implements View.OnClickListener {
protected QuestionViewPager questionsViewPager;
protected TabLayout questionTabs;
protected ProgressBar progressBar;
protected TextView questionNumber;
protected FloatingActionButton nextButton;
protected long testTime;
protected Chronometer chronometer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
public class QuestionControlActivity extends QuestionBaseActivity implements View.OnClickListener, QuestionControlFragment.OnQuestionListener, ControlDialogFragment.OnControlDialogFragmentListener {
private QuestionControlViewModel viewModel;
private FloatingActionButton finishButton;
private Theme currentTheme;
private int correctAnswerCount = 0;
@Inject
ViewModelProviderFactory providerFactory;
@Inject
QuestionControlAdapter questionAdapter;
@Inject
ControlDialogFragment controlDialogFragment;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
public class QuestionControlFragment extends QuestionBaseFragment implements View.OnClickListener, OptionViewHolder.OnOptionListener {
@Inject
QuestionControlActivity questionActivity;
public static QuestionControlFragment newInstance(int position) {
QuestionControlFragment fragment = new QuestionControlFragment();
Bundle args = new Bundle();
args.putInt("position", position);
fragment.setArguments(args);
return fragment;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
AndroidSupportInjection.inject(this);
super.onViewCreated(view, savedInstanceState);
}
儿童活动:
public abstract class QuestionBaseActivity extends DaggerAppCompatActivity implements View.OnClickListener {
protected QuestionViewPager questionsViewPager;
protected TabLayout questionTabs;
protected ProgressBar progressBar;
protected TextView questionNumber;
protected FloatingActionButton nextButton;
protected long testTime;
protected Chronometer chronometer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
public class QuestionControlActivity extends QuestionBaseActivity implements View.OnClickListener, QuestionControlFragment.OnQuestionListener, ControlDialogFragment.OnControlDialogFragmentListener {
private QuestionControlViewModel viewModel;
private FloatingActionButton finishButton;
private Theme currentTheme;
private int correctAnswerCount = 0;
@Inject
ViewModelProviderFactory providerFactory;
@Inject
QuestionControlAdapter questionAdapter;
@Inject
ControlDialogFragment controlDialogFragment;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
public class QuestionControlFragment extends QuestionBaseFragment implements View.OnClickListener, OptionViewHolder.OnOptionListener {
@Inject
QuestionControlActivity questionActivity;
public static QuestionControlFragment newInstance(int position) {
QuestionControlFragment fragment = new QuestionControlFragment();
Bundle args = new Bundle();
args.putInt("position", position);
fragment.setArguments(args);
return fragment;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
AndroidSupportInjection.inject(this);
super.onViewCreated(view, savedInstanceState);
}
此活动包含一个片段
碱基片段:
public class QuestionBaseFragment extends DaggerFragment implements OptionViewHolder.OnOptionListener {
protected View view;
protected TextView questionText;
protected PhotoView questionImage;
protected RecyclerView options;
protected FloatingActionButton submitButton;
protected SingleQuestionViewModel viewModel;
protected int position;
protected Question question;
protected OnQuestionListener questionListener;
protected ProgressBar loadQuestionProgress;
protected Button skipQuestButton;
protected AnswerTask answerTask = new AnswerTask();
@Inject
ViewModelProviderFactory providerFactory;
@Inject
OptionAdapter optionAdapter;
@Inject
CountTimer timer;
@Inject
protected FrontCameraProvider frontCam;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = inflater.inflate(R.layout.fragment_question, container, false);
position = getArguments().getInt("position");
return view;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
AndroidSupportInjection.inject(this);
}
需要活动的子片段:
public abstract class QuestionBaseActivity extends DaggerAppCompatActivity implements View.OnClickListener {
protected QuestionViewPager questionsViewPager;
protected TabLayout questionTabs;
protected ProgressBar progressBar;
protected TextView questionNumber;
protected FloatingActionButton nextButton;
protected long testTime;
protected Chronometer chronometer;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
public class QuestionControlActivity extends QuestionBaseActivity implements View.OnClickListener, QuestionControlFragment.OnQuestionListener, ControlDialogFragment.OnControlDialogFragmentListener {
private QuestionControlViewModel viewModel;
private FloatingActionButton finishButton;
private Theme currentTheme;
private int correctAnswerCount = 0;
@Inject
ViewModelProviderFactory providerFactory;
@Inject
QuestionControlAdapter questionAdapter;
@Inject
ControlDialogFragment controlDialogFragment;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
AndroidInjection.inject(this);
super.onCreate(savedInstanceState);
}
public class QuestionControlFragment extends QuestionBaseFragment implements View.OnClickListener, OptionViewHolder.OnOptionListener {
@Inject
QuestionControlActivity questionActivity;
public static QuestionControlFragment newInstance(int position) {
QuestionControlFragment fragment = new QuestionControlFragment();
Bundle args = new Bundle();
args.putInt("position", position);
fragment.setArguments(args);
return fragment;
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
AndroidSupportInjection.inject(this);
super.onViewCreated(view, savedInstanceState);
}
匕首2。片段生成器模块:
@Module
@QuestionScope
@ContributesAndroidInjector(
// modules = {QuestionFragmentBuilderModule.class, QuestionViewModelsModule.class, QuestionModule.class, QuestionBaseFragmentBuilderModule.class}
modules = { QuestionViewModelsModule.class, QuestionModule.class, QuestionBaseFragmentBuilderModule.class}
)
abstract QuestionActivity contributeQuestionActivity();
@QuestionScope
@ContributesAndroidInjector(
// modules = {QuestionFragmentBuilderModule.class, QuestionViewModelsModule.class, QuestionModule.class, QuestionBaseFragmentBuilderModule.class}
modules = { QuestionViewModelsModule.class, QuestionModule.class, QuestionBaseFragmentBuilderModule.class}
)
abstract QuestionBaseActivity contributeQuestionBaseActivity();
@QuestionScope
@ContributesAndroidInjector (
// modules = {QuestionModule.class, QuestionViewModelsModule.class, ControlQuestionFragmentBuilderModule.class}
modules = {QuestionModule.class, QuestionViewModelsModule.class, QuestionBaseFragmentBuilderModule.class}
)
abstract QuestionControlActivity contributeQuestionControlActivity();
公共抽象类QuestionBaseFragmentBuilderModule{
@OptionScope
@ContributesAndroidInjector (
modules = {OptionModule.class}
)
abstract QuestionBaseFragment contributeQuestionBaseFragment();
@OptionScope
@ContributesAndroidInjector (
modules = {OptionModule.class}
)
abstract QuestionFragment contributeQuestionFragment();
@OptionScope
@ContributesAndroidInjector (
modules = {OptionModule.class}
)
abstract InteractiveQuestionFragment contributeInteractiveQuestionFragment();
@OptionScope
@ContributesAndroidInjector(
modules = {OptionModule.class}
)
abstract QuestionControlFragment contributeQuestionControlFragment();
}
活动生成器模块:
@Module
@QuestionScope
@ContributesAndroidInjector(
// modules = {QuestionFragmentBuilderModule.class, QuestionViewModelsModule.class, QuestionModule.class, QuestionBaseFragmentBuilderModule.class}
modules = { QuestionViewModelsModule.class, QuestionModule.class, QuestionBaseFragmentBuilderModule.class}
)
abstract QuestionActivity contributeQuestionActivity();
@QuestionScope
@ContributesAndroidInjector(
// modules = {QuestionFragmentBuilderModule.class, QuestionViewModelsModule.class, QuestionModule.class, QuestionBaseFragmentBuilderModule.class}
modules = { QuestionViewModelsModule.class, QuestionModule.class, QuestionBaseFragmentBuilderModule.class}
)
abstract QuestionBaseActivity contributeQuestionBaseActivity();
@QuestionScope
@ContributesAndroidInjector (
// modules = {QuestionModule.class, QuestionViewModelsModule.class, ControlQuestionFragmentBuilderModule.class}
modules = {QuestionModule.class, QuestionViewModelsModule.class, QuestionBaseFragmentBuilderModule.class}
)
abstract QuestionControlActivity contributeQuestionControlActivity();
生成错误:
error: [Dagger/MissingBinding] com.example.nktest.ui.question.QuestionControlActivity cannot be provided without an @Inject constructor or an @Provides-annotated method. This type supports members injection but cannot be implicitly provided.
A binding with matching key exists in component: com.example.nktest.di.ActivityBuilderModule_ContributeQuestionControlActivity.QuestionControlActivitySubcomponent
com.example.nktest.ui.question.QuestionControlActivity is injected at
com.example.nktest.ui.question.QuestionControlFragment.questionActivity
com.example.nktest.ui.question.QuestionControlFragment is injected at
dagger.android.AndroidInjector.inject(T) [com.example.nktest.di.AppComponent ? com.example.nktest.di.ActivityBuilderModule_ContributeQuestionActivity.QuestionActivitySubcomponent ? com.example.nktest.di.question.QuestionBaseFragmentBuilderModule_ContributeQuestionControlFragment.QuestionControlFragmentSubcomponent]
The following other entry points also depend on it:
dagger.android.AndroidInjector.inject(T) [com.example.nktest.di.AppComponent ? com.example.nktest.di.ActivityBuilderModule_ContributeQuestionBaseActivity.QuestionBaseActivitySubcomponent ? com.example.nktest.di.question.QuestionBaseFragmentBuilderModule_ContributeQuestionControlFragment.QuestionControlFragmentSubcomponent]
dagger.android.AndroidInjector.inject(T) [com.example.nktest.di.AppComponent ? com.example.nktest.di.ActivityBuilderModule_ContributeQuestionControlActivity.QuestionControlActivitySubcomponent ? com.example.nktest.di.question.QuestionBaseFragmentBuilderModule_ContributeQuestionControlFragment.QuestionControlFragmentSubcomponent]
如何在体系结构中使用dagger?您不需要将活动注入片段,因为片段已经有
getActivity()
和requireAction()
方法。您可以使用onAttach(上下文)
callback,以将对该上下文的引用保留为活动。例如,您是否能够解决此问题?如果可以,请共享答案。根据以下代码实验室,在调用super之后,调用inject in fragment的最佳位置是在onAttach()方法中。