2013-02-12 29 views
5

मेरे पास एक कस्टम लेआउट (केवल एक संपादन टेक्स्ट) के साथ एक अलर्टडिअलॉग है और मैं ठीक बटन क्लिक होने पर डेटा को सत्यापित करना चाहता हूं। अगर सत्यापन विफल रहता है तो मैं संवाद बंद नहीं करना चाहता हूं।डायलॉगफ्रैगमेंट के साथ एंड्रॉइड अलर्टडियलॉग: यदि ओके पर क्लिक किया गया है तो भी संवाद बंद न करें

मैं संवाद के डिफ़ॉल्ट बटन (सकारात्मक और नकारात्मक) का उपयोग कर रहा हूं। अगर मैं "setPositiveButton (" ", नया DialogInterface.OnClickListener() ..." संवाद हमेशा बंद रहता है। मैंने कई पोस्ट देखी हैं और उन्होंने कहा कि ऑनक्लिक श्रोता को ओवरराइड किया जाना चाहिए, लेकिन मैं इसे काम नहीं कर सकता । इस कोड को मैंने पाया है:

Button theButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE); 
theButton.setOnClickListener(new CustomListener(dialog)); 

चूंकि यह कहते हैं कि यह किया जाना चाहिए संवाद दिखा के बाद मैं अपने गतिविधि के अंदर इस कोड को रखा, मेरे DialogFragment अंदर नहीं, लेकिन अगर मैं mDialogFragment.getDialog का उपयोग करें (यह) हमेशा रिटर्न अशक्त

यह मेरा संवाद टुकड़ा का एक हिस्सा है:।

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // Use the Builder class for convenient dialog construction 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

    builder.setTitle(R.string.new); 

    LayoutInflater inflater = getActivity().getLayoutInflater(); 
    dialogView = inflater.inflate(R.layout.edit_license, null); 

    builder.setView(dialogView) 

    // Add action buttons 
    .setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int id) { 

     } 
    }) 
    .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      MyDialogFragment.this.getDialog().cancel(); 
     } 
    }); 

    return builder.create(); 

} 

और मेरी गतिविधि में मैं निम्न करें:

DialogFragment dialog = new MyDialogFragment(true, null); 
dialog.show(getSupportFragmentManager(), "EditLicenseDialogFragment"); 

AlertDialog alertDialog = (AlertDialog)dialog.getDialog(); 
alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); 
btnPositive.setOnClickListener(new CustomListener(alertDialog)); 

... 

class CustomListener implements View.OnClickListener { 
    private final Dialog dialog; 
    public CustomListener(Dialog dialog) { 
     this.dialog = dialog; 
    } 
    @Override 
    public void onClick(View v) { 
     ... 
    } 
} 

जैसा कि मैंने कहा, (AlertDialog) dialog.getDialog(); हमेशा शून्य देता है। ऐसा क्यों है? अगर सत्यापन ठीक नहीं है तो मैं संवाद बंद करने से कैसे बच सकता हूं?

धन्यवाद!

उत्तर

3

यहाँ DialogFragment के संदर्भ से कुछ पाठ है:

एक टुकड़ा है कि एक संवाद विंडो प्रदर्शित करता है, इसके गतिविधि के विंडो के शीर्ष पर तैर। इस खंड में एक डायलॉग ऑब्जेक्ट होता है, जिसे खंड के राज्य के आधार पर उपयुक्त के रूप में प्रदर्शित करता है। डायलॉग (इसे दिखाने के लिए, छुपाएं, इसे खारिज करने का निर्णय लेना) को एपीआई के माध्यम से पर किया जाना चाहिए, संवाद पर सीधे कॉल के साथ नहीं।

इसके बजाय getDialog बुलाने की

()। खारिज() आप खारिज करना चाहिए()

+0

दिलचस्प। और GetButton समारोह के बारे में क्या? यह डायलॉग फ्रैगमेंट पर नहीं है, और यदि मैं संवाद प्राप्त करने का प्रयास करता हूं तो यह शून्य हो जाता है। –

+3

संवाद शून्य हो जाता है क्योंकि getDialog द्वारा लौटाया गया mDialog नहीं बनाया गया है (अभी तक)। समाधान डायलॉगफ्रैगमेंट के अंदर अन्य जीवन चक्र विधियों को लागू करना होगा जो क्रिएटडिअलॉग/शो फ़ंक्शन पर होते हैं। लेकिन यह वास्तव में आपके लिए एक समस्या नहीं है केवल क्लिक लिस्टनर को संवादफलक के अंदर परिभाषित करें (जैसा कि अब है)। लेकिन संवाद पर संवाद संचालन न करें लेकिन संवादफलक पर, इसके साथ आपको getDialog() – Tobrun

4

यह समाधान मेरे लिए काम करता है। डायलॉग पहले से ही रेज़्यूम में दिखाई दे रहा है, इसलिए यह बटन तक पहुंचने और श्रोताओं को बदलने के लिए एक अच्छी जगह है।

public class XYZFragment extends DialogFragment { 
    ... 

    @Override 
    public void onResume() { 
     super.onResume(); 

     AlertDialog dialog = (AlertDialog)getDialog(); 

     Button positiveButton = dialog.getButton(DialogInterface.BUTTON_POSITIVE); 
     positiveButton.setOnClickListener(new View.OnClickListener() {     
      @Override 
      public void onClick(View onClick) { 
      ... 
      } 
     }); 
    } 
} 
+0

पर कॉल करने की आवश्यकता नहीं है, अब मुझे ठीक बटन नहीं दिख रहा है –