एंड्रॉइड गतिविधि संवाद को बाहर के स्पर्श पर बंद करने से रोकें


228

मेरे पास एक गतिविधि है जो Theme.Dialog शैली का उपयोग कर रही है जैसे कि यह किसी अन्य गतिविधि पर एक अस्थायी विंडो है। हालाँकि, जब मैं संवाद विंडो (पृष्ठभूमि गतिविधि पर) के बाहर क्लिक करता हूं, तो संवाद बंद हो जाता है। मैं इस व्यवहार को कैसे रोक सकता हूं?


1
आप ऐसा क्यों करेंगे। यदि आप जो व्यवहार चाहते हैं वह संवाद का है, तो संवाद का उपयोग क्यों नहीं करते? आपके सवाल पर आते हुए, मुझे नहीं लगता कि इसका कोई हल है।
कुमार बिबेक

@KumarBibek संवाद सीमित हैं जब लेआउट अनुकूलन की बात आती है ... इसलिए यह एक गतिविधि है। यहां तक ​​कि डेवलपर डॉक्स ने लचीले अनुकूलन के लिए इस दृष्टिकोण की सिफारिश की है
लियो

1
और जो ओपी चाहता है वह एक मोडल डायलॉग है, यानी एक संवाद जो उपयोगकर्ता को जवाब देने के लिए मजबूर करता है, जैसे कि ठीक है, या हां / नहीं। उपयोगकर्ता को केवल क्लिक करने में सक्षम नहीं होना चाहिए।
स्कॉट बिग्स

जवाबों:


33

यह आपकी मदद कर सकता है। यह ईवेंट के बाहर टच को हैंडल करने का एक तरीका है:

विंडो के बाहर छूने पर गतिविधि जैसी थीम्ड थीम्ड को कैसे रद्द करें?

घटना को पकड़ने और कुछ भी नहीं करने से, मुझे लगता है कि आप समापन को रोक सकते हैं। लेकिन जो अजीब है, वह यह है कि जब आप बाहर स्पर्श करते हैं तो आपकी गतिविधि संवाद का डिफ़ॉल्ट व्यवहार खुद को बंद नहीं करना चाहिए ।

(पुनश्च: कोड WindowManager.LayoutParams का उपयोग करता है)


1
वस्तु हालांकि एक संवाद नहीं है, यह एक गतिविधि है जो संवाद शैली का उपयोग करती है। गतिविधि में यह विधि नहीं है, और इसे डायलॉग में नहीं डाला जा सकता है।
फर्गुस्मैक

उर पोस्ट जो पूछा गया था, उसके ठीक विपरीत है। उन्होंने पूछा कि इसे कैसे रोका जाए, इसे कैसे रोका जाए।
चकली

4
जो उसने "घटना को पकड़कर और कुछ नहीं कर रहा है, के साथ समझाया, मुझे लगता है कि आप समापन को रोक सकते हैं"।
मेट्रो

4
किसी कारण से, पूरे FLAG_NOT_MODAL, WATCH_OUTSIDE_TOUCH करने के बाद, बाहर का स्पर्श वास्तव में गतिविधियों को बंद नहीं करता है, लेकिन गतिविधि के पीछे का बटन क्लिक किया जाता है। उसके लिए कोई विचार?
njzk2

ध्यान दें कि डायलॉग्स में एक छाया है (कम से कम अब तक (8.0)): यदि आप छाया पर क्लिक करते हैं तो एंड्रॉइड व्याख्या करेगा कि जैसे वह डायलॉग के अंदर था, वैसे ही क्लिक करें। बस इसे दुनिया के साथ साझा करना चाहता था, मुझे इसे प्राप्त करने में 10 मिनट लगे।
लोरेंजो वॉन मैटरहॉर्न

458

डायलॉग बॉक्स को बैक की दबाए जाने से खारिज करने से रोकने के लिए इसका उपयोग करें

dialog.setCancelable(false);

और डायलॉग बॉक्स को बाहर के स्पर्श पर खारिज करने से रोकने के लिए इसका उपयोग करें

 dialog.setCanceledOnTouchOutside(false);

4
यह उत्तर मददगार है लेकिन यह प्रश्न Theme.Dialog विशेषता का उपयोग करते हुए गतिविधि के बारे में है।
परेश मेयानी

15
मुझे पता है कि जब मुझे पता चलता है कि बहुत देर हो चुकी है क्योंकि यह बहुत से लोगों की मदद करता है इसलिए इसे हटाया नहीं गया।
सिंघक

12
मुझे पता है कि यह वास्तव में सवाल से संबंधित नहीं था, लेकिन इससे मुझे मदद मिली। धन्यवाद!
डेनिसड्रूव

5
यह सबसे अच्छा जवाब है। मुझे ज्यादातर लोगों पर संदेह है, जो इस सवाल को पाते हैं, मानक AlertDialogको छूने पर बंद करने से रोकने के लिए एक रास्ता तलाश रहे हैं , और यही वह जवाब प्रदान करता है।
आरोह

20
AlertDialog के नए संस्करणों पर, आपको केवल उपयोग करने की आवश्यकता हैsetCancelable(false)
कोबी टेट

120

आपके पास वास्तव में एक गतिविधि है (भले ही यह संवाद की तरह दिखता हो), इसलिए आपको setFinishOnTouchOutside(false)अपनी गतिविधि से कॉल करना चाहिए यदि आप इसे पृष्ठभूमि गतिविधि पर क्लिक करने के दौरान इसे खुला रखना चाहते हैं।

EDIT: यह केवल एंड्रॉइड एपीआई स्तर 11 या उससे अधिक के साथ काम करता है


4
यह आपको आपकी गतिविधि में "बैक" बटन दबाने से नहीं रोकता है। इसलिए आपको onBackPressed()शरीर में कुछ भी नहीं करने की ज़रूरत है
एलेक्स बोनल

यह onBackPressed () के बिना उस डायलॉग एक्टिविटी में "बैक" बटन को नहीं रोक रहा है। इस के साथ एकदम सही काम करता है ।setFinishOnTouchOutside (झूठी)।
कुनालक्सीगैग

68

मेरे लिए जो काम किया गया था DialogFragmentवह एक सेट बनाने के लिए था कि इसे रद्द न किया जाए:

dialog.setCancelable(false);

1
अनुपयोगी। यह सवाल डायलॉग्स नहीं बल्कि एक्टिविटीज के बारे में है।
स्कॉट बिग्स

20

OnCreate में गतिविधि के रूप में संवाद का उपयोग करते समय इसे जोड़ें

setFinishOnTouchOutside(false);

17

उच्च API 10 के लिए, जब डायलॉग बाहर छुआ जाता है, तब गायब हो जाता है, जबकि API 11 से कम होने पर, डायलॉग गायब नहीं होता है। इसे रोकने के लिए, आपको करने की आवश्यकता है:

इन styles.xml:<item name="android:windowCloseOnTouchOutside">false</item>

या

में onCreate()विधि, का उपयोग करें:this.setFinishOnTouchOutside(false);

नोट: एपीआई 10 और निम्न के लिए, इस पद्धति का प्रभाव नहीं है, और इसकी आवश्यकता नहीं है।


14

झूठे होने के लिए रद्द किए गए संवाद को सेट करना पर्याप्त है, और या तो आप अलर्ट डायलॉग के बाहर टच करें या बैक बटन पर क्लिक करें, जिससे अलर्ट डायलॉग गायब हो जाएगा। तो इस एक का उपयोग करें:

setCancelable(false)

और अन्य कार्य अब आवश्यक नहीं है: dialog.setCanceledOnTouchOutside(false);

यदि आप एक अस्थायी संवाद बना रहे हैं और कोड की इस पंक्ति को रखने के लिए सोच रहे हैं, तो यहां एक उदाहरण है:

new AlertDialog.Builder(this)
                        .setTitle("Trial Version")
                        .setCancelable(false)
                        .setMessage("You are using trial version!")
                        .setIcon(R.drawable.time_left)
                        .setPositiveButton(android.R.string.yes, null).show();

12

इस कोड का उपयोग करें यह मेरे लिए काम कर रहा है

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


यह सही उत्तर होना चाहिए, अगर वह सही प्रश्न कर सके!
alijunior

2
यह सही उत्तर होगा, अगर ओपी संवाद के बारे में पूछ रहा था ! लेकिन सवाल गतिविधियों के बारे में है - काफी अलग मामला है।
स्कॉट बिग्स

11
Dialog dialog = new Dialog(context)
dialog.setCanceledOnTouchOutside(true); 
//use this to dismiss the dialog on outside click of dialog

dialog.setCanceledOnTouchOutside(false);
//use this for not to dismiss the dialog on outside click of dialog.

संवाद के बारे में अधिक जानकारी के लिए इस लिंक को देखें

dialog.setCancelable(false);
//used to prevent the dismiss of dialog on backpress of that activity

dialog.setCancelable(true);
//used to dismiss the dialog on onbackpressed of that activity

कृपया ध्यान दें कि प्रश्न संवादों के रूप में उपयोग की जाने वाली गतिविधियों से संबंधित है, न कि संवाद वर्ग से।
स्कॉट बिग्स

8

सीधे शब्दों में,

alertDialog.setCancelable(false);

उपयोगकर्ता को डायलॉग बॉक्स के बाहर क्लिक करने से रोकें।


6

अलर्ट डायलॉग को हटा दिया गया है, इसलिए डायलॉग डायलॉग = नए डायलॉग (यह) का उपयोग करें;

बाहरी स्पर्श को रोकने के लिए

dialog.setCanceledOnTouchOutside(false);

5

setFinishOnTouchOutside(false)API> 11 के लिए उपयोग करें और चिंता न करें क्योंकि इसके एंड्रॉइड का डिफ़ॉल्ट व्यवहार जो गतिविधि थीम्ड डायलॉग API <11 :) के लिए बाहरी स्पर्श पर समाप्त नहीं होगा !!


5

मैं onCreate () में इसका उपयोग करता हूं, एंड्रॉइड के किसी भी संस्करण पर काम करने लगता है; 5.0 और 4.4.x पर परीक्षण किया गया, जिंजरब्रेड पर परीक्षण नहीं किया जा सकता, सैमसंग उपकरणों (नोट 1 जीबी चल रहा है) में यह डिफ़ॉल्ट रूप से है:

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
    {
        setFinishOnTouchOutside(false);
    }
    else
    {
        getWindow().clearFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH);
    }

    super.onCreate(savedInstanceState);

4
        alert.setCancelable(false);
        alert.setCanceledOnTouchOutside(false);

मुझे लगता है कि यह आपकी मदद करेगा। यह मेरे लिए काम किया


1
कृपया यह भी समझाने की कोशिश करें कि यह क्यों काम करेगा ... बस एक कोड डंप एक अच्छा जवाब नहीं है।
कोडबेंडर


2

OnCancelListener को लागू करने के लिए अलग-अलग कार्रवाई करना संभव है:

alertDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){                   
    @Override
    public void onCancel(DialogInterface dialogInterface) {
        //Your custom logic
    } 
});

अलर्ट डायलॉग के बाहर टैपिंग के कारण रद्द करने को कहा जाता है तो मैं कैसे पहचान सकता हूं?
सीगप्रकाश

अलर्ट डायलॉग के बाहर टैप करने पर कस्टम एक्शन बनाने में बहुत मददगार!
एडम एस।

1

मैं उसी समस्या का सामना कर रहा था। इसे संभालने के लिए मैंने OntouchListenerडायलॉग सेट किया और अंदर कुछ नहीं किया। लेकिन डायलॉग स्क्रीन को घुमाने पर भी खारिज हो जाता है। इसे ठीक करने के लिए मैंने यह बताने के लिए एक चर निर्धारित किया कि क्या संवाद सामान्य रूप से खारिज हो गया है। फिर मैंने OnDismissListenerअपने संवाद के लिए एक सेट किया और अंदर मैं चर की जांच करता हूं। यदि संवाद में सामान्य रूप से कोई अंतर नहीं है, तो मैं इसे फिर से चलाता हूं (और मेरे मामले में खारिज करते समय उसकी स्थिति निर्धारित करता हूं)।


1

builder.setCancelable (गलत);


सार्वजनिक शून्य Mensaje (देखें v) {

    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle("¿Quieres ir a el Menú principal?");
    builder.setMessage("Al presionar SI iras a el menú y saldras de la materia.");
    builder.setPositiveButton("SI", null);
    builder.setNegativeButton("NO", null);
    builder.setCancelable(false);
    builder.show();
}

1
नमस्ते एलेक्स। StackOverflow में आपका स्वागत है और आपके उत्तर के लिए धन्यवाद। क्या आप यह बताने के लिए अपने उत्तर को संपादित कर सकते हैं कि आपका कोड क्या करता है और यह कैसे ओपी की समस्या को हल करता है? कोड केवल उत्तर हतोत्साहित करते हैं क्योंकि वे सिखाते नहीं हैं या क्यों समझाते हैं । धन्यवाद!
टिम मैलोन

-1

यह आपके सभी सवालों का सही जवाब है .... आशा है कि आप एंड्रॉइड में कोडिंग का आनंद लेंगे

new AlertDialog.Builder(this)
            .setTitle("Akshat Rastogi Is Great")
            .setCancelable(false)
            .setMessage("I am the best Android Programmer")
            .setPositiveButton("I agree", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();

                }
            })
            .create().show();

इस कोड स्निपेट के लिए धन्यवाद, जो कुछ सीमित, तत्काल सहायता प्रदान कर सकता है। एक उचित व्याख्या यह दर्शाती है कि यह समस्या का एक अच्छा समाधान क्यों है, यह बताकर इसके दीर्घकालिक मूल्य में बहुत सुधार करेगा और यह भविष्य के पाठकों के लिए अन्य, समान प्रश्नों के साथ अधिक उपयोगी होगा। कृपया अपने स्पष्टीकरण को संपादित करने के लिए कुछ स्पष्टीकरण जोड़ने के लिए, जिसमें आपके द्वारा की गई धारणाएँ शामिल हैं।
मैक्सिमिलियन पीटर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.