2016-12-21 9 views
0

ダガー2を使用してViewPagerAdapterを注入する方法がわかりません。このメソッドを使用する必要はないかもしれません。ダガー2 - ViewPagerAdapter

私はViewPagerが含まれていると私はそれが動的にViewPager数を変更できるようにViewPagerにおけるこれらFragment Sの1は、アダプタへのアクセスを許可するActivityを持っています。 @Injectを使用して提供する際

は、私が持っている主な問題は、私は次のエラーを取得されてVerticalViewPagerAdapter

public VerticalViewPagerAdapter(FragmentManager fm) 
    { 
     super(fm); 
     userProgress = 1; 
    } 

ない@Provide INGでsuper(fm)をしようとnewでインスタンス化した後にスローされます

java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' on a null object reference 、私はこのエラーを取得しません。私はそれが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()); 
    } 
} 
+1

あなたは 'アンドロイドで新しいMainActivityを()'を返すようなものをやるべきではありません。 Androidはアクティビティの構築を管理し、任意に構築することはできません。そうした場合、コンストラクタを呼び出すだけで完全に機能するアクティビティが提供されないため、上記のようなエラーが発生します。代わりに、コールバック 'onCreate()'を使用してそこに注入する必要があります。このパターンに従うDagger-2プロジェクトのサンプルが多数あります。 [Dagger-2を使用するGoogle Androidアーキテクチャの設計図](https://github.com/googlesamples/android-architecture) –

答えて

2

私はそれがあなたのモジュールに次のような方法で注入していますMainActivityに関係してい推測:

provideVerticalViewPagerAdapter(MainActivity mainActivity) 

は、私はあなたのモジュールを初期化する提案することができますContext、したがってFragmentManagerが利用可能であることを確認するためにMainActivityのインスタンスであるコンテキスト:

@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()); 
    } 
} 

あなたは注入時に続いて、あなたがこのような活動のインスタンスとモジュールを初期化する必要がありますが:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    DaggerMainActivityComponent 
     .builder() 
     .mainComponent(MyApplication.component()) 
     .mainActivityModule(new MainActivityModule(this)) 
     .build() 
     .inject(this); 
} 
+0

モジュールを初期化するにはどうすればよいですか?私は現時点でモジュールを1つしか使用せず、 'MainActivity'を参照せずに' MyApplication'クラスで初期化します。 'MainActivity'で' MyApplication.component()。inject(this); 'を使用します。 –

+0

MainActivityで初期化してから、 –

+0

Thxを注入して、あなたのソリューションが私のために働いたと思います – Billyjoker

関連する問題