40

को रद्द करने से बैक बटन को कैसे रोकें मेरे पास एक फ्रैगमेंट है जो डायलॉग फ्रैगमेंट बना सकता है और पॉप अप कर सकता है, लेकिन जब मैं बैक बटन दबाता हूं, तो यह संवाद को खारिज कर देता है भले ही मैं स्पष्ट रूप से सेट को रद्द करने योग्य (झूठा) कहूं; क्या मेरे डायलॉग फ्रैगमेंट के बैक बटन पर असंवेदनशील होने का कोई तरीका है?एंड्रॉइड: फ्रैगमेंटडिअलॉग

public class LoadingDialogFragment extends DialogFragment 
{ 
    String title; 
    String msg; 

    public LoadingDialogFragment() 
    { 
     this.title = "Loading..."; 
     this.msg = "Please wait..."; 
    } 
    public LoadingDialogFragment(String title, String msg) 
    { 
     this.title = title; 
     this.msg = msg; 
    } 

    @Override 
    public Dialog onCreateDialog(final Bundle savedInstanceState) 
    { 
     final ProgressDialog dialog = new ProgressDialog(getActivity()); 

     dialog.setTitle(title); 
     dialog.setMessage(msg); 
     dialog.setIndeterminate(true); 
     dialog.setCanceledOnTouchOutside(false); 
     dialog.setCancelable(false); 

     return dialog; 
    } 

} 

मैं एक asynctask से FragmentDialog बनाएँ:

private class GpsTask extends AsyncTask<String, Integer, Integer> 
{ 
    //ProgressDialog dialog; 
    @Override 
    protected void onPreExecute() 
    { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     DialogFragment newFragment = new LoadingDialogFragment("Gathering Location", "Acquiring GPS lock..."); 
     ft.addToBackStack(null); 
     newFragment.show(ft, "dialog"); 
    } 

    @Override 
    protected Integer doInBackground(String... params) 
    { 
     //acquire a GPS lock and grab a few position updates 
    } 

    @Override 
    protected void onProgressUpdate(Integer... input) { } 

    @Override 
    protected void onPostExecute(Integer result) 
    { 
     getSupportFragmentManager().popBackStackImmediate(); 
    } 
} 

उत्तर

94

कैसे के बारे में setCancelable का उपयोग कर? क्या तुमने कोशिश की?

डॉक्स से -

नियंत्रित करें कि दिखाया गया संवाद रद्द करने योग्य है। सीधे कॉल Dialog.setCancelable (बुलियन) के बजाय इस का प्रयोग करें, DialogFragment जरूरतों इस

+29

यह सही है! यह पता चला है कि आपको डायलॉगफ्रेगमेंट पर सेट कैंसेलबल (झूठा) को कॉल करना होगा, न कि आंतरिक संवाद जो यह रखता है! – MattF

+1

@MattF यह टिप्पणी एक जीवन बचतकर्ता है। मुझे एहसास नहीं हुआ कि मुझे 'प्रोग्रेसडिअलॉग' के बजाय 'डायलॉगफ्रेगमेंट' पर 'सेट कैंसेलबल()' कॉल करने की आवश्यकता है। धन्यवाद! – prolink007

4

मैं बिल्कुल यकीन है कि अगर इस FragmentDialogs के साथ काम करेंगे नहीं कर रहा हूँ के आधार पर अपने व्यवहार को बदलने के क्योंकि, लेकिन अगर setCancelable आपके लिए काम नहीं किया है, इस आलेख को देखने के लायक हो सकता है: Android: Prompt user to save changes when Back button is pressed

यह बताता है कि बैक बटन दबाए जाने का तरीका कैसा है। तो शायद आप बटन प्रेस दबा सकते हैं और यह संवाद बंद होने से रोक देगा?

+0

मैं दूसरे जवाब के साथ आगे बढ़ गया लेकिन मुझे लगता है कि यह भी काम करता है, बहुत धन्यवाद – MattF

1

यह आपकी मदद कर सकता है।

newFragment.setCancelable(false); 

ऊपर जब नीचे दिए नमूने में के रूप में DialogFragment वस्तु या कस्टम DialogFragment के निर्माता में बनाने की तरह परिवर्तन करें।

public static CustomClearHourDialog newInstance(Bundle args, IDialogListener listener) 
     { 
      CustomClearHourDialog clearHourDialog = new CustomClearHourDialog();    
      CustomClearHourDialog.listener = listener; 
      clearHourDialog.setCancelable(false); 
      return clearHourDialog; 
     }