Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 匕首2继承活动和碎片_Android_Dependency Injection_Dagger 2 - Fatal编程技术网

Android 匕首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

我在我的应用程序中使用了dagger 2,我得到了这个错误

我有基本活动:

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()方法中。