带有 FragmentPagerAdapter 的 Dagger - android
Dagger with FragmentPagerAdapter - android
我在我的 ViewPager
中使用 Dagger,如下所示。
我的ViewPagerAdapter.java
:
public class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList; // note: this can cause crashes
private final List<String> mFragmentTitleList;
private final FragmentManager fragmentManager;
@Inject
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
this.fragmentManager = manager;
this.mFragmentList = new ArrayList<>();
this.mFragmentTitleList = new ArrayList<>();
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
super.destroyItem(container, position, object);
// remove destroyed Fragment from FragmentManager
if (!mFragmentList.contains(object)) {
fragmentManager.beginTransaction().remove((Fragment) object).commit();
}
}
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE;
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
在 MainActvity
中,我使用如下方式:
public class MainActivity extends DaggerAppCompatActivity{
@Inject
ViewPagerAdapter viewPagerAdapter;
private void setupViewPager(ViewPager viewPager) {
Intent intent = getIntent();
viewPagerAdapter.addFragment(new WorkTableFragment(), getString(R.string.workTable));
viewPagerAdapter.addFragment(MouFragment.newInstance(langID, lang), getString(R.string.mou));
viewPager.setAdapter(viewPagerAdapter);
tabsMainActivity.setupWithViewPager(viewPager);
viewPager.setCurrentItem(1);
}
}
}
我的 classes
的 dagger
就像下面这样。我的 ActivityBuilder
:
@Module
public abstract class ActivityBuilder {
@ContributesAndroidInjector(modules = MainActivityModule.class)
abstract MainActivity bindMainActivity();
}
和AppComponent
:
@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class,
AppModule.class,
ActivityBuilder.class})
public interface AppComponent extends AndroidInjector<DaggerApplication> {
void inject(App app);
@Override
void inject(DaggerApplication instance);
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
}
和AppModule
:
@Module
public abstract class AppModule {
@Binds
abstract Context provideContext(Application application);
}
还有我的 MainActivityModule
:
@Module
public abstract class MainActivityModule {
private static MainActivity mainActivity;
public MainActivityModule(MainActivity mainActivity) {
this.mainActivity = mainActivity;
}
@Provides
static MainPresenter provideMainPresenter(MainContract.MainContractView mainView, DataSourcesLocal dataSourcesLocal) {
return new MainPresenter(mainView, dataSourcesLocal);
}
@Provides
static ViewPagerAdapter provideViewPagerAdapter() {
return new ViewPagerAdapter(mainActivity.getSupportFragmentManager());
}
@Binds
abstract MainContract.MainContractView provideMainView(MainActivity mainActivity);
}
我的申请class:
public class App extends DaggerApplication {
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
AppComponent appComponent = DaggerAppComponent
.builder()
.application(this)
.build();
appComponent.inject(this);
return appComponent;
}
}
但是出现如下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentManager android.support.v4.app.FragmentActivity.getSupportFragmentManager()' on a null object reference
解决了我的问题:
@Module
public abstract class MainActivityModule {
@Provides
static MainPresenter provideMainPresenter(MainContract.MainContractView mainView, DataSourcesLocal dataSourcesLocal) {
return new MainPresenter(mainView, dataSourcesLocal);
}
@Provides
static ViewPagerAdapter provideViewPagerAdapter(MainActivity mainActivity) {
return new ViewPagerAdapter(mainActivity.getSupportFragmentManager());
}
@Binds
abstract MainContract.MainContractView provideMainView(MainActivity mainActivity);
}
将您的 MainModule
更改为:
@Module
public abstract class MainActivityModule {
@Provides
static MainPresenter provideMainPresenter(MainContract.MainContractView mainView, DataSourcesLocal dataSourcesLocal) {
return new MainPresenter(mainView, dataSourcesLocal);
}
@Provides
static ViewPagerAdapter provideViewPagerAdapter(MainActivity mainActivity) {
return new ViewPagerAdapter(mainActivity.getSupportFragmentManager());
}
@Binds
abstract MainContract.MainContractView provideMainView(MainActivity mainActivity);
}
您不必自己实例化模块:Dagger 会为您处理并提供 MainActivity
.
的正确实例
我在我的 ViewPager
中使用 Dagger,如下所示。
我的ViewPagerAdapter.java
:
public class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragmentList; // note: this can cause crashes
private final List<String> mFragmentTitleList;
private final FragmentManager fragmentManager;
@Inject
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
this.fragmentManager = manager;
this.mFragmentList = new ArrayList<>();
this.mFragmentTitleList = new ArrayList<>();
}
@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
super.destroyItem(container, position, object);
// remove destroyed Fragment from FragmentManager
if (!mFragmentList.contains(object)) {
fragmentManager.beginTransaction().remove((Fragment) object).commit();
}
}
@Override
public int getItemPosition(@NonNull Object object) {
return POSITION_NONE;
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
在 MainActvity
中,我使用如下方式:
public class MainActivity extends DaggerAppCompatActivity{
@Inject
ViewPagerAdapter viewPagerAdapter;
private void setupViewPager(ViewPager viewPager) {
Intent intent = getIntent();
viewPagerAdapter.addFragment(new WorkTableFragment(), getString(R.string.workTable));
viewPagerAdapter.addFragment(MouFragment.newInstance(langID, lang), getString(R.string.mou));
viewPager.setAdapter(viewPagerAdapter);
tabsMainActivity.setupWithViewPager(viewPager);
viewPager.setCurrentItem(1);
}
}
}
我的 classes
的 dagger
就像下面这样。我的 ActivityBuilder
:
@Module
public abstract class ActivityBuilder {
@ContributesAndroidInjector(modules = MainActivityModule.class)
abstract MainActivity bindMainActivity();
}
和AppComponent
:
@Singleton
@Component(modules = {
AndroidSupportInjectionModule.class,
AppModule.class,
ActivityBuilder.class})
public interface AppComponent extends AndroidInjector<DaggerApplication> {
void inject(App app);
@Override
void inject(DaggerApplication instance);
@Component.Builder
interface Builder {
@BindsInstance
Builder application(Application application);
AppComponent build();
}
}
和AppModule
:
@Module
public abstract class AppModule {
@Binds
abstract Context provideContext(Application application);
}
还有我的 MainActivityModule
:
@Module
public abstract class MainActivityModule {
private static MainActivity mainActivity;
public MainActivityModule(MainActivity mainActivity) {
this.mainActivity = mainActivity;
}
@Provides
static MainPresenter provideMainPresenter(MainContract.MainContractView mainView, DataSourcesLocal dataSourcesLocal) {
return new MainPresenter(mainView, dataSourcesLocal);
}
@Provides
static ViewPagerAdapter provideViewPagerAdapter() {
return new ViewPagerAdapter(mainActivity.getSupportFragmentManager());
}
@Binds
abstract MainContract.MainContractView provideMainView(MainActivity mainActivity);
}
我的申请class:
public class App extends DaggerApplication {
@Override
protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
AppComponent appComponent = DaggerAppComponent
.builder()
.application(this)
.build();
appComponent.inject(this);
return appComponent;
}
}
但是出现如下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.support.v4.app.FragmentManager android.support.v4.app.FragmentActivity.getSupportFragmentManager()' on a null object reference
解决了我的问题:
@Module
public abstract class MainActivityModule {
@Provides
static MainPresenter provideMainPresenter(MainContract.MainContractView mainView, DataSourcesLocal dataSourcesLocal) {
return new MainPresenter(mainView, dataSourcesLocal);
}
@Provides
static ViewPagerAdapter provideViewPagerAdapter(MainActivity mainActivity) {
return new ViewPagerAdapter(mainActivity.getSupportFragmentManager());
}
@Binds
abstract MainContract.MainContractView provideMainView(MainActivity mainActivity);
}
将您的 MainModule
更改为:
@Module
public abstract class MainActivityModule {
@Provides
static MainPresenter provideMainPresenter(MainContract.MainContractView mainView, DataSourcesLocal dataSourcesLocal) {
return new MainPresenter(mainView, dataSourcesLocal);
}
@Provides
static ViewPagerAdapter provideViewPagerAdapter(MainActivity mainActivity) {
return new ViewPagerAdapter(mainActivity.getSupportFragmentManager());
}
@Binds
abstract MainContract.MainContractView provideMainView(MainActivity mainActivity);
}
您不必自己实例化模块:Dagger 会为您处理并提供 MainActivity
.