2012-08-27 23 views
47

मैं एंड्रॉइड में बैक बटन दबाते समय एक अलर्टडिअलॉग बॉक्स को बंद करने से रोकने की कोशिश कर रहा हूं। मैंने in this thread दोनों लोकप्रिय विधियों का पालन किया है, और System.out.println के साथ मैं देख सकता हूं कि दोनों मामलों में कोड निष्पादित होता है। हालांकि, बैक बटन अभी भी डायलॉग बॉक्स बंद कर देता है।एक संवाद बॉक्स को बंद करने से वापस बटन को रोकें

मैं गलत क्या कर सकता था? आखिरकार मैं एक संवाद बॉक्स को बंद करने वाले बैक बटन को रोकने की कोशिश कर रहा हूं - यह एक अस्वीकरण है जो पहली बार ऐप चलाया जाता है और मैं नहीं चाहता कि उपयोगकर्ता के पास कोई विकल्प हो लेकिन "स्वीकार करें" बटन दबाए ऐप जारी रखने के लिए आदेश।

AlertDialog.Builder builder = new AlertDialog.Builder(this); 
builder.setCancelable(false); 

इस संवाद को बंद करने से वापस बटन से बचाता है, लेकिन "नकारात्मक" बटन बरकरार अगर आप इसे उपयोग करने के लिए चुना है छोड़ देता है:

+1

यदि आपको किसी उपयोगकर्ता को लाइसेंस या अस्वीकरण (या जो कुछ भी) स्वीकार करने की आवश्यकता है तो आपको ** इन्हें अस्वीकार करने की अनुमति देनी चाहिए। यदि वे 'बैक' बटन पर क्लिक करते हैं तो सुनिश्चित करें कि अगली बार जब वे ऐप शुरू करेंगे तब तक आपका लाइसेंस/अस्वीकरण संवाद फिर से दिखाई देगा जब तक कि वे या तो अपने डिवाइस से ऐप को स्वीकार या हटा नहीं देते। यदि आप सैम द्वारा सुझाए गए दृष्टिकोण का उपयोग करना चुनते हैं तो आपको ** ** एक 'अस्वीकार करें' बटन प्रदान करना होगा, फिर अगली बार जब वे ऐप शुरू करेंगे तो लाइसेंस/अस्वीकरण फिर से बनाएं। – Squonk

+1

मैं एक ऐप हटा दूंगा जो मुझे एकमात्र विकल्प के रूप में "स्वीकार" देता है ... और होम बटन को अक्षम करने के बारे में भी सोचें! – WarrenFaith

+0

ऐप को होम बटन दबाकर बंद किया जा सकता है, लेकिन अनिवार्य रूप से ऐप अस्वीकरण से पहले प्रगति नहीं कर सकता है अगर लाइसेंस स्वीकार नहीं किया गया है। @ सक्कोक, आप उल्लेख करते हैं कि मुझे * उन्हें * इनकार करने की अनुमति देनी चाहिए; क्या यह एक कानूनी मुद्दा है? यानी क्या कोई कानून है कि लाइसेंस समझौते को स्वीकार किए बिना सॉफ़्टवेयर उपयोग योग्य (यदि इसका भुगतान किया गया हो) होना चाहिए? N.B. मेरे पास पहले से ही 'गिरावट' बटन है, और इसे दबाकर एक टोस्ट() कहता है कि आपको ऐप का उपयोग करने के लिए समझौते को स्वीकार करना होगा। इस प्रकार संवाद बॉक्स तब तक जारी रहता है जब तक कि स्वीकार नहीं किया जाता है। – CaptainProg

उत्तर

110

सीधे शब्दों में setCancelable() सुविधा का उपयोग।


जबकि किसी भी उपयोगकर्ता है कि सेवा के अपने शर्तों को स्वीकार करने के लिए उपयोगकर्ता समझौते के "बाहर समर्थन" से उन्हें रोकने के लिए दो से अधिक तरीकों यहाँ घर बटन पुश कर सकते हैं, Squonk की टिप्पणी के आलोक में, नहीं चाहते हैं।

builder.setNegativeButton("Refuse", new OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       finish(); 
      } 
     }) 
     .setOnKeyListener(new OnKeyListener() { 
      @Override 
      public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 
       if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) 
        finish(); 
       return false; 
      } 
     }); 
+0

इसके कामकाज, धन्यवाद –

+18

इसके अतिरिक्त, यदि 'डायलॉग फ्रैगमेंट' का उपयोग करना है, तो आपको उस पर' सेट कैंसेलबल 'कॉल करना चाहिए, न कि' संवाद 'पर – Kuffs

+0

बहुत धन्यवाद @ कफ्स। मैं इसे संवाद पर स्थापित कर रहा था और सोच रहा था कि यह क्यों काम नहीं कर रहा है! – sasikt

10

वापस बटन को रोकने के लिए एक संवाद बंद कर देता है (गतिविधि पर निर्भर करता है) के बिना, बस नीचे दिए कोड:

alertDialog.setOnKeyListener(new DialogInterface.OnKeyListener() { 
    @Override 
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 
     // Prevent dialog close on back press button 
     return keyCode == KeyEvent.KEYCODE_BACK; 
    } 
}); 
एक एक साधारण "इनकार" बटन और अन्य ओवरराइड संवाद में वापस बटन है
+1

मेरे मामले में खूबसूरती से काम किया। मुझे अपने ऐप पर 'वेब व्यू' लोड करना पड़ा। मुझे 'canGoBack()' की जांच करनी थी और अगर यह गलत था तो संवाद बंद कर दिया था। – pandalion98

1

उपयोग setCancelable(false)

SampleDialog sampleDialog = SampleDialog.newInstance(); 
sampleDialog.setCancelable(false); 
sampleDialog.show(getSupportFragmentManager(), SampleDialog.class.getSimpleName()); 
0

केवल यह मेरे लिए काम किया:

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 
builder.setTitle(title); 
builder.setMessage(content); 

/** 
* Make it when the Back button is pressed, the dialog isn't dismissed. 
*/ 
builder.setOnKeyListener(new DialogInterface.OnKeyListener() { 
    @Override 
    public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { 
     if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { 
      Utilities.makeToast(getContext(), "There is no way back!"); 
      return true; // Consumed 
     } 
     else { 
      return false; // Not consumed 
     } 
    } 
}); 

Dialog dialog = builder.create(); 

/** 
* Make it so touching on the background activity doesn't close the dialog 
*/ 
dialog.setCanceledOnTouchOutside(false); 

return dialog; 

जैसा कि आप देख सकते हैं, मैंने dialog.setCanceledOnTouchOutside(false); लाइन भी जोड़ दी है ताकि संवाद के बाहर टैप करने से नतीजा न हो।

0

जब DialogFragment का उपयोग कर आप टुकड़ा पर setCancelable() कॉल करने के लिए, संवाद नहीं की आवश्यकता होगी:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    dialog = new ProgressDialog(getActivity()); 
    dialog.setIndeterminate(true); 
    dialog.setMessage(...); 
    setCancelable(false); 

    return dialog; 
} 

कॉलिंग dialog.setCancelable() कोई असर नहीं लग रहे हैं। ऐसा लगता है कि DialogFragment रद्द करने के लिए संवाद की सेटिंग का नोटिस नहीं करता है।