2015-05-26 3 views
6

Ich versuche, Mortar & Flow in meiner App und konfrontiert mit einem Problem, dass ich nicht SeiteAdapter mit Bildschirmen statt Fragmente arbeiten kann.Mörtel und Flow-Bibliotheken vs ViewPager

Wer hat es richtig hinbekommen?

ist mir nicht gelungen, aber wahrscheinlich jemand mich von diesem Punkt führen kann:

Der anfängliche Dolch Anmeldung:

@Module(
    injects = { 
      MainActivity.class, 
    }, 
    library = true, 
    complete = false 
) 
public class DaggerConfig { 
    @SuppressWarnings("unused") 
    @Provides @Singleton Gson provideGson() { 
     return new GsonBuilder().create(); 
    } 
} 

Mainscreen, dessen Ansicht präsentiert ViewPager:

@Layout(R.layout.screen_main) @WithModule(MainScreen.Module.class) 
public class MainScreen extends Path { 
    @dagger.Module(injects = MainView.class, addsTo = DaggerConfig.class) 
    public static class Module {} 

    @Singleton 
    public static class Presenter extends ViewPresenter<MainView> { 
     @Inject 
     public Presenter() {} 
    } 
} 

Hauptansicht:

........... 
@Inject 
MainScreen.Presenter presenter; 
........... 
@Override protected void onFinishInflate() { 
    super.onFinishInflate(); 
    ButterKnife.inject(this); 

    final Path[] screens = { 
      new SubScreen("1"), 
      new SubScreen("2"), 
      new SubScreen("3"), 
    }; 

    CustomPagerAdapter customPagerAdapter = new CustomPagerAdapter(getContext(), screens); 
    customPagerAdapter .setAdapter(firstRunPagerAdapter); 
} 
..... 

Nun der Hauptteil, SUBSCREEN (3 ähnliche Bildschirme, die sich nur durch die Parameter in ihnen sind wir vorbei => sie sollten Ansichten anpassen diese Parameter entsprechend)

@Layout(R.layout.screen_subscreen) @WithModule(SubScreen.Module.class) 
public class SubScreen extends Path { 
    private final String title; 
    public SubScreen(String titleParam) { 
     title = titleParam; 
    } 

    @dagger.Module(injects = SubView.class, addsTo = DaggerConfig.class) 
    public class Module { 
     @Provides 
     SubViewMetadata provideSubViewMetadata() { 
      return new SubViewMetadata(backgroundColor, title); 
     } 
    } 

    @Singleton 
    public static class Presenter extends ViewPresenter<SubView> { 

     private String title; 

     @Inject 
     public Presenter(String title) { 
      this.title= title; 
     } 

     @Override 
     protected void onLoad(Bundle savedInstanceState) { 
      super.onLoad(savedInstanceState); 
      if (!hasView()) { 
       return; 
      } 

      getView().setTitle(subViewMetadata.title); 
     } 
    } 
} 

und es ist Sicht public class SubView erstreckt FrameLayout {

@InjectView(R.id.subViewTitleTextView) 
    TextView subViewTitleTextView; 

    @Inject 
    SubScreen.Presenter presenter; 

    public SubView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     ObjectGraphService.inject(context, this); 
    } 

    public void setTitle(String title) { 
     subViewTitleTextView.setText(title); 
    } 

    @Override protected void onAttachedToWindow() {....} 

    @Override protected void onDetachedFromWindow() {....} 
...... 
} 

Benutzerdefinierte Pager-Adapter:

public class CustomPagerAdapter extends PagerAdapter { 
    private final Context context; 
    private final Path[] screens; 

    public CustomPagerAdapter(Context context, Path[] screens) { 
     this.context = context; 
     this.screens = screens; 
    } 

    @Override 
    public int getCount() { 
     return (screens == null)? 0 : screens.length; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object o) { 
     return view.equals(o); 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Path screen = screens[position]; 
     MortarScope originalScope = MortarScope.getScope(context); 
     MortarScope newChildScope = originalScope.buildChild().build("tutorialpage" + position); 
     Context childContext = newChildScope.createContext(context); 
     View newChild = Layouts.createView(childContext, screen); 
     container.addView(newChild); 
     return newChild; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     View view = ((View) object); 
     container.removeView(view); 
     MortarScope.getScope(view.getContext()).destroy(); 
    } 
} 

Die Problembeschreibung: Es stürzt ab, da die SubView-Klasse nicht in der Liste der Injektionen in der "Layouts.createView (childContext, Bildschirm)" hinzugefügt wurde; Moment im Adapter, und ich kann es nicht standardmäßig hinzufügen, weil ich einen @provider von Daten von Subscreen zu Subscreen.Presenter haben möchte. (Ich benutze lokale Variable.

Wenn ich SubView.class in die Liste der Injektionen hinzufügen und lokale Screen Variablen in statische konvertieren, dann habe ich 3 identische Seiten innerhalb des ViewPager (was logisch ist, wie jeder nächster Aufruf des Konstruktors.? - Überschreibungen alte statische Variablen)

Jede Hilfe/Ideen Danke für Ihre Hilfe, Konstantin

+1

Bitte erläutern Sie ganz und genau, was "es nicht geschafft hat, es zum Laufen zu bringen" bedeutet. – CommonsWare

+0

@CommonsWare hi, es bedeutet, dass das Schnipsel von oben veraltet ist und nicht mit aktuellen Versionen von Flow & Mortar funktioniert, d. H. –

+0

d. H. Die Frage ist meistens, wie man einen Bildschirm bekommt, um eine Ansicht für diesen Bildschirm zu erhalten. Ich denke, das ist jetzt mein größtes Problem. –

Antwort

4

Ok, habe ich herausgefunden

zu allererster Zugabe SubView in. Liste von global injiziert Klassen Dann Modifizieren SUBSCREEN Klasse:

@Layout(R.layout.screen_subscreen) 
public class SubScreen extends Path { 
    private static String titleStatic; // Introducing static variable 
    private final String title; 
    public SubScreen(String titleParam) { 
     title = titleParam; 
    } 

    public void refreshPresenter() { 
     titleStatic = title; 
    } 

    @Singleton 
    public static class Presenter extends ViewPresenter<SubView> { 

     private String title; 

     @Inject 
     public Presenter() { 
     } 

     @Override 
     protected void onLoad(Bundle savedInstanceState) { 
      super.onLoad(savedInstanceState); 
      if (!hasView()) { 
       return; 
      } 

      getView().setTitle(titleStatic); 
     } 
    } 
} 

und dann in den kundenspezifischen Adapter tun dies ändert:

public class CustomPagerAdapter extends PagerAdapter { 
    private final Context context; 
    private final SubScreen[] screens; 

    public CustomPagerAdapter(Context context, SubScreen[] screens) { 
     this.context = context; 
     this.screens = screens; 
    } 
    ...... 
    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     SubScreen screen = screens[position]; 
     MortarScope originalScope = MortarScope.getScope(context); 
     MortarScope newChildScope = originalScope.buildChild().build("tutorialpage" + position); 
     Context childContext = newChildScope.createContext(context); 

     screen.refreshPresenter(); // updating the static var with local one! 

     View newChild = Layouts.createView(childContext, screen); 
     container.addView(newChild); 
     return newChild; 
    } 
    .... 
} 

D.h. Die Lösung besteht darin, die lokalen Variablen UND im Bildschirm beizubehalten, wenn derselbe Bildschirm wiederverwendet werden soll. Und wenn wir die Ansicht aufblähen, setzen wir einfach den richtigen Wert auf den statischen (der im Presenter verwendet wird).

Ich bin mir nicht sicher, dass es die bestmögliche Lösung ist, aber es funktioniert. Es wäre schön zu hören, wenn es verbessert werden kann.