我不确定如何使用Dagger 2注射ViewPagerAdapter
。也许我不需要使用此方法。
我有Activity
,其中包含ViewPager
,我希望Fragment
中的其中一个ViewPager
能够访问适配器,以便它可以动态更改ViewPager
数。{/ p>
我遇到的主要问题是在使用@Inject
并提供VerticalViewPagerAdapter
时出现以下错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' on a null object reference
后抛出的 super(fm)
public VerticalViewPagerAdapter(FragmentManager fm)
{
super(fm);
userProgress = 1;
}
如果没有@Provide
并使用new
进行实例化,我不会收到此错误。我认为它与getSupportFragmentManager()
方法有关。
我的MainModule:
@Module
public class MainModule
{
private final MyApplication app;
public MainModule(MyApplicationapplication)
{
app = application;
}
@Provides
@Singleton
protected Application provideApplication()
{
return app;
}
@Provides
@Singleton
protected Resources provideResources()
{
return app.getResources();
}
@Provides
@Singleton
protected MainActivity provideMainActivity()
{
return new MainActivity();
}
@Provides
@Singleton
protected MainPresenter provideMainPresenter(MainActivity mainActivity)
{
return new MainPresenterImpl(mainActivity);
}
@Provides
@Singleton
protected VerticalViewPagerAdapter provideVerticalViewPagerAdapter(MainActivity mainActivity)
{
// This line here
return new VerticalViewPagerAdapter(mainActivity.getSupportFragmentManager());
}
}
答案 0 :(得分:2)
我想这与您在模块中的以下方法中注入的MainActivity有关:
provideVerticalViewPagerAdapter(MainActivity mainActivity)
我是否可以建议使用作为MainActivity
实例的Context初始化模块,以确保Context和FragmentManager可用,如下所示:
@Module
public class MainActivityModule {
private final MainActivity myActivity;
public MainActivityModule(MainActivity activity) {
this.myActivity= activity;
}
@Provides
@PerActivity
protected VerticalViewPagerAdapter provideVerticalViewPagerAdapter() {
return new VerticalViewPagerAdapter(myActivity.getSupportFragmentManager());
}
}
然后当你注入时,你必须使用Activity的实例初始化模块,如下所示:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DaggerMainActivityComponent
.builder()
.mainComponent(MyApplication.component())
.mainActivityModule(new MainActivityModule(this))
.build()
.inject(this);
}