2015-05-26 11 views
6

मैं अपने ऐप में मोर्टार & प्रवाह को अनुकूलित करने की कोशिश कर रहा हूं और किसी समस्या का सामना कर रहा हूं, कि मैं पेजएडाप्टर को टुकड़ों के बजाय स्क्रीन के साथ काम नहीं कर सकता।मोर्टार और फ्लो लाइब्रेरी बनाम व्यूपर

कोई भी इसे सही करने में कामयाब रहा?

मैं सफल नहीं हुआ लेकिन, शायद किसी ने मुझे इस बिंदु से मार्गदर्शन कर सकते हैं:

प्रारंभिक डैगर पंजीकरण:

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

MainScreen, जिसका देखें होस्ट कर रहा है 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() {} 
    } 
} 

मुख्य दृश्य:

........... 
@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); 
} 
..... 
अब

, मुख्य हिस्सा, SubScreen (3 समान स्क्रीन, कि केवल मानकों हम उन्हें में गुजर रहे हैं के आधार पर भिन्न => वे इन मानकों के अनुसार विचारों का समायोजन करना चाहिए)

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

और यह दृश्य सार्वजनिक वर्ग है subview फैली 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() {....} 
...... 
} 

कस्टम पेजर अनुकूलक:

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

समस्या कथन: यह क्रैश हो रहा है, क्योंकि सबव्यू क्लास को "लेआउट्स.क्रेटव्यू (बालकेंटेक्स्ट, स्क्रीन) पर इंजेक्शन की सूची में जोड़ा नहीं गया है;" एडाप्टर में पल, और मैं इसे डिफ़ॉल्ट रूप से नहीं जोड़ सकता, क्योंकि मैं उपस्क्रीन से उपस्क्रीन में डेटा का @ प्रोविडर होना चाहता हूं। प्रतिनिधि। (मैं स्थानीय चर का उपयोग कर रहा हूँ।

तो मैं इंजेक्शन की सूची में SubView.class जोड़ सकते हैं और स्थिर में स्थानीय स्क्रीन के चर कनवर्ट करते हैं, तो मैं ViewPager (जो तार्किक है अंदर 3 समान पृष्ठों होगा, हर रूप में निर्माता की अगली कॉल -।? ओवरराइड वर्ष स्थैतिक चर)

किसी भी मदद/विचारों आपकी मदद के लिए धन्यवाद, Konstantin

+1

कृपया समझाएं, पूरी तरह से और सटीक, क्या "इसे काम करने में कामयाब नहीं है" का अर्थ है। – CommonsWare

+0

@ कॉमन्सवेयर हाय, इसका मतलब है कि ऊपर से स्निपेट पुराना है और फ्लो एंड मोर्टार के वर्तमान संस्करणों के साथ काम नहीं करता है, दुर्भाग्य से –

+0

यानी सवाल यह है कि इस स्क्रीन के लिए एक स्क्रीन प्राप्त करने के लिए स्क्रीन कितनी है। मुझे लगता है कि अब यह मेरा सबसे बड़ा मुद्दा है। –

उत्तर

4

ठीक है, मैं पता लगा

सबसे पहले, में subview जोड़ने। वैश्विक स्तर पर सूची इंजेक्शन कक्षाएं फिर संशोधित SubScreen वर्ग: यानी

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; 
    } 
    .... 
} 

:

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

और फिर कस्टम अनुकूलक में इसमें परिवर्तन करना समाधान स्क्रीन पर स्थानीय और स्थिर चर रखने के लिए है, यदि एक ही स्क्रीन का पुन: उपयोग किया जा रहा है। और जब हम इसे दृश्य को बढ़ाते हैं - केवल स्थिर मूल्य को सही मान निर्धारित करते हैं (जिसे प्रेजेंटर में उपयोग किया जाएगा)।

मुझे यकीन नहीं है कि यह सबसे अच्छा संभव समाधान है, लेकिन यह काम करता है। सुनना अच्छा होगा, अगर इसे बेहतर किया जा सकता है।

संबंधित मुद्दे