2014-05-02 15 views
5

का उपयोग करके एक संवाद से उपयोगकर्ता इनपुट प्राप्त करना मैं Mortar + Flow के साथ अपना ऐप बना रहा हूं। मैं एक पॉपअप दिखाने का सही तरीका जानने का प्रयास कर रहा हूं जो उपयोगकर्ता से कुछ पाठ का अनुरोध करता है। मैंने इस पॉपअप क्लास को बनाया है:मोर्टार + फ्लो

public class SavedPageTitleInputPopup implements Popup<SavedPageTitleInput, Optional<String>> { 

private final Context context; 

private AlertDialog dialog; 

public SavedPageTitleInputPopup(Context context) { 
    this.context = context; 
} 

@Override public Context getContext() { 
    return context; 
} 

@Override 
public void show(final SavedPageTitleInput info, boolean withFlourish, 
       final PopupPresenter<SavedPageTitleInput, Optional<String>> presenter) { 
    if (dialog != null) throw new IllegalStateException("Already showing, can't show " + info); 

    final EditText input = new EditText(context); 
    LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, 
                   LinearLayout.LayoutParams.MATCH_PARENT); 
    input.setLayoutParams(lp); 
    input.setText(info.savedPage.getName()); 

    dialog = new AlertDialog.Builder(context).setTitle(info.title) 
              .setView(input) 
              .setMessage(info.body) 
              .setPositiveButton(info.confirm, new DialogInterface.OnClickListener() { 
               @Override public void onClick(DialogInterface d, int which) { 
                dialog = null; 
                final String newTitle = Strings.emptyToNull(String.valueOf(input.getText())); 
                presenter.onDismissed(Optional.fromNullable(newTitle)); 
               } 
              }) 
              .setNegativeButton(info.cancel, new DialogInterface.OnClickListener() { 
               @Override public void onClick(DialogInterface d, int which) { 
                dialog = null; 
                presenter.onDismissed(Optional.<String>absent()); 
               } 
              }) 
              .setCancelable(true) 
              .setOnCancelListener(new DialogInterface.OnCancelListener() { 
               @Override public void onCancel(DialogInterface d) { 
                dialog = null; 
                presenter.onDismissed(Optional.<String>absent()); 
               } 
              }) 
              .show(); 
} 

@Override public boolean isShowing() { 
    return dialog != null; 
} 

@Override public void dismiss(boolean withFlourish) { 
    dialog.dismiss(); 
    dialog = null; 
} 
} 

यह कक्षा अपेक्षा के अनुसार काम करती है। संवाद में क्या प्रदर्शित करना है यह जानने के लिए यह SavedPage का उपयोग करता है और सही बटन दबाए जाने पर PopupPresenter#onDismissed का उपयोग करके उपयोगकर्ताओं को PopupPresenter पर इनपुट देता है।

मेरी समस्या PopupPresenter सबक्लास लिख रही है जो इनपुट प्रस्तुत करने और इनपुट को संसाधित करने के लिए उपयोग की जाती है। टिप्पणियाँ

new PopupPresenter<SavedPage, Optional<String>>() { 
    @Override protected void onPopupResult(Optional<String> result) { 
    if (result.isPresent()) { 
     // The user entered something, so update the API 
     // Oh wait, I don't have a reference to the SavedPage 
     // that was displayed in the dialog! 
    } 
    } 
} 

के रूप में कहते हैं, मैं SavedPage कि संवाद में प्रदर्शित किया गया था के लिए एक संदर्भ की जरूरत नहीं है: यह है कि मैं क्या अभी है। इसे whatToShow फ़ील्ड में PopupPresenter में संग्रहीत किया गया था, लेकिन onPopupResult कहलाए जाने से पहले यह फ़ील्ड ठीक हो गया है। ऐसा लगता है कि SavedPage की एक अतिरिक्त प्रतिलिपि रखने के लिए मैं खुद को अनावश्यक रूप से दोहराना चाहूंगा।

उत्तर

0

PopupPresenter और Popup पर अभी तक बहुत सारे दस्तावेज नहीं हैं। मैंने देखा है कि एकमात्र चीज नमूना परियोजना में एक बुनियादी उदाहरण है। वे Confirmation ऑब्जेक्ट के भीतर डेटा के आधार पर ConfirmerPopup बनाते हैं। ConfirmerPopup का उद्देश्य क्लास घोषणा द्वारा देखे गए पुष्टिकरण वस्तु को दिए गए शीर्षक/निकाय के आधार पर उपयोगकर्ता से बूलियन निर्णय लेना है।

public class ConfirmerPopup implements Popup<Confirmation, Boolean> { 

अपने मामले में आप उपयोगकर्ता से अतिरिक्त उपयोगकर्ता इनपुट टेक्स्ट कैप्चर करना चाहते हैं। जब PopupPresenter # onPopupResult को परिणाम ऑब्जेक्ट कहा जाता है तो सहेजे गए PageTitleInputPopup से आवश्यक सभी डेटा होना चाहिए। इस प्रकार

public class SavedPageTitleInputPopup implements Popup<SavedPage, SavedPageResults> { 
    private final Context context; 
    private AlertDialog dialog; 

    public SavedPageTitleInputPopup(Context context) { 
    this.context = context; 
    } 

    @Override public Context getContext() { 
    return context; 
    } 

    @Override 
    public void show(SavedPage info, boolean withFlourish, final PopupPresenter<SavedPage, SavedPageResults> presenter) { 
    if (dialog != null) throw new IllegalStateException("Already showing, can't show " + info); 
    // Create your Dialog but scrape all user data within OnClickListeners 
    final AlertDialog.Builder builder = new AlertDialog.Builder(context); 
    //Anything else you need to do... .setView() or .setTitle() for example 
    builder.setPositiveButton(info.confirm, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface d, int which) { 
     dialog = null; 
     //Save data to SavedPageResults 
     final SavedPageResults results = new SavedPageResults(): 
     presenter.onDismissed(results); 
     } 
    }); 
    builder.setNegativeButton(info.cancel, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface d, int which) { 
     dialog = null; 
     final SavedPageResults results = new SavedPageResults(); 
     presenter.onDismissed(results); 
     } 
    }); 
    dialog = builder.show(); 
    } 

    @Override public boolean isShowing() { 
    return dialog != null; 
    } 

    @Override public void dismiss(boolean withFlourish) { 
    dialog.dismiss(); 
    dialog = null; 
    } 
} 

आपका PopupPresenter अब संवाद के कार्यान्वयन के बारे में कुछ भी पता की जरूरत नहीं है अपने SavedPageTitleInputPopup संशोधित करें।

new PopupPresenter<SavedPage, SavedPageResults>() { 
    @Override protected void onPopupResult(SavedPageResults result) { 
    if (result.isPresent()) { 
     updateUi(result.getSavedText()); 
    } 
    } 
} 
+0

उत्तर के लिए धन्यवाद। मैंने पहले से ही 'ConfirmerPopup' उदाहरण देखा है और इसे संशोधित किया है ताकि मेरा संवाद प्रदर्शित हो जैसा मैं चाहता हूं। जैसा कि मैंने इस प्रश्न में उल्लेख किया है, मेरी समस्या को 'पॉपअपपोर्टर' में 'व्हाट्स शो' फ़ील्ड का संदर्भ रखने के साथ करना है। मुझे नहीं लगता कि आपने इसका उत्तर दिया है। –

+0

आपको 'व्हाट्स शो' के संदर्भ की आवश्यकता नहीं है। 'OnPopupResult' में आपको पहुंचने की क्या आवश्यकता है जिसे आप' ऑनक्लिक लिस्टनर 'में नहीं प्राप्त कर सकते हैं? – Alex

+0

@ scompt.com अगर आप अपने प्रश्न को अपने पूर्ण 'सहेजे गए पेजटेटल इनपुटपॉप' और 'popup.xml' के साथ अपडेट करते हैं तो मैं आपको दिखाऊंगा कि मेरा क्या मतलब है। – Alex

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