2016-12-21 2 views
0

Ich bin mir nicht sicher, wie man mit Dolch 2 eine ViewPagerAdapter injizieren kann. Vielleicht muss ich diese Methode nicht verwenden.Dolch 2 - ViewPagerAdapter

Ich habe eine Activity, die eine ViewPager enthält, und ich möchte eine dieser Fragment s im ViewPager Zugriff auf den Adapter haben, so dass es dynamisch die ViewPager Zahl ändern kann.

Das Hauptproblem ich habe, ist bekomme ich folgende Fehlermeldung, wenn @Inject Verwendung und die Bereitstellung der VerticalViewPagerAdapter:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.os.Handler android.support.v4.app.FragmentHostCallback.getHandler()' on a null object reference die nach super(fm) bei dem Versuch ausgelöst wird,

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

Wenn nicht @Provide ing und der Instanziierung mit new Ich bekomme diesen Fehler nicht. Ich glaube, es hat etwas mit der getSupportFragmentManager() Methode zu tun.

Mein 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

Sie sollten nie etwas tun, wie 'return new MainActivity()' in Android. Android verwaltet die Konstruktion Ihrer Aktivität, Sie können sie nicht beliebig konstruieren, und wenn Sie dies tun, werden Sie mit Fehlern konfrontiert, wie Sie oben beschrieben werden, da das Aufrufen des Konstruktors keine voll funktionsfähige Aktivität bereitstellt. Stattdessen müssen Sie die Callbacks 'onCreate()' verwenden und dort injizieren. Es gibt viele Beispiel-Dolch-2-Projekte, die diesem Muster folgen. Siehe [der Google Android Architektur-Entwurf, der Dagger-2 verwendet] (https://github.com/googlesamples/android-architecture) –

Antwort

2

Ich denke, es hat mit dem MainActivity zu tun, die in der folgenden Methode in Ihrem Modul injiziert hat:

provideVerticalViewPagerAdapter(MainActivity mainActivity) 

Darf ich vorschlagen, das Modul mit einer Initialisierung Kontext, der eine Instanz der MainActivity ist, um sicherzustellen, dass der Kontext und damit der FragmentManager zur Verfügung stehen, etwa so:

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

Dann, wenn Sie injizieren, würden Sie das Modul mit der Instanz der Aktivität wie folgt initialisieren müssen:

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

Wie würde ich dann das Modul initialisieren? Ich benutze zur Zeit nur ein Modul und es wird in einer 'MyApplication' Klasse ohne Bezug auf' MainActivity' initialisiert. Ich benutze dann 'MyApplication.component(). Inject (this);' in der 'MainActivity' –

+0

Ich denke, Sie können versuchen, es in der MainActivity initialisieren, dann injizieren es –

+0

Thx, Ihre Lösung funktionierte für mich – Billyjoker