web-dev-qa-db-ja.com

ダガー2:フラグメントでインジェクションを使用する方法

AndroidInjection.inject(this)を使用して、コンポーネントをアクティビティに挿入しています。

AndroidInjectionには、Android.app.Fragmentをパラメーターとして受け取るオーバーロードメソッドもあります。しかし、私のフラグメントはAndroid.support.v4.app.Fragmentを拡張しており、対応するメソッドはありません。

質問:フラグメントがAndroid.support.v4.app.Fragmentを拡張する場合の注入の使用方法

4
Sasha Shpota

サポートライブラリフラグメントについては、サポートインジェクションを使用する必要があります。ここにいくつかの例があります:

@Singleton
@Component(modules = {
        AndroidSupportInjectionModule.class, // Important
        ActivityModule.class,
        FragmentModule.class
})

public interface AppComponent extends AndroidInjector<App> {

    void inject(App app);

    @Component.Builder
    interface Builder {
        @BindsInstance
        Builder application(Application application);
        AppComponent build();
    }
}

アプリケーション、たとえば Multidex実装 が必要な場合は、DaggerApplicationまたは単純なHasSomeIjectionを使用できます。

public class App extends MultiDexApplication implements
    HasActivityInjector,
    HasFragmentInjector {

    @Inject DispatchingAndroidInjector<Activity> activityInjector;
    @Inject DispatchingAndroidInjector<Fragment> fragmentInjector;
    private AppComponent mComponent;

    @Override
    public void onCreate() {
        mComponent = DaggerAppComponent.builder().application(this).build();
        mComponent.inject(this);
    }

    // Dependency Injection
    @Override
    public DispatchingAndroidInjector<Activity> activityInjector() {
        return activityInjector;
    }

    @Override
    public DispatchingAndroidInjector<Fragment> fragmentInjector() {
        return fragmentInjector;
    }
}

次のモジュール:

@Module
public abstract class FragmentModule {
    @ContributesAndroidInjector
    abstract ContactsFragment bindContactsFragment();
}

活動モジュール:

@Module
public abstract class ActivityModule {
    @ContributesAndroidInjector
    abstract ContactsActivity bindContactsActivity();
}

そしてフラグメント:

import com.some.ContactsPresenter;
import dagger.Android.support.DaggerFragment;

public class ContactsFragment extends DaggerFragment {

    @Inject
    ContactsPresenter mContactsPresenter;

    // .....
}

DaggerFragmentを使用したくない場合は、その実装を開き、必要な変更を加えてフラグメントにコピーできます。ここでの主な機能は、AndroidSupportInjectionModuleの使用です。これがあなたを助けることを願っています

7
dantes_21