दिलचस्प पोस्ट
क्यों पीएक्स के बजाय उन्हें? जावास्क्रिप्ट में यूआरएल के जीईटी पैरामीटर का उपयोग करना एंड्रॉइड – वेबव्यू में प्रवेश के बाद कुकीज़ निकालने JVM ध्वज CMSClassUnloading वास्तव में क्या सक्षम है? एंड्रॉइड स्टूडियो ट्रांसफ़ॉर्म एक्सपैशन: त्रुटि: कार्य के लिए निष्पादन विफल ': एप: ट्रांसफ़ॉर्म क्लासेसहैडडेक्सफ़ोर्डडब्यूब' एक पुनरावर्ती सीटीई कैसे चलाती है, रेखा से रेखा? डेटाफ्रेम से डुप्लिकेट हटाएं डुप्लिकेट सेलुलर सिग्नल की शक्ति मापना PHP का उपयोग करके क्लाइंट आईपी एड्रेस प्राप्त करें PHP का उपयोग कर वेबसाइट पर ओसीआर कैसे लागू कर सकता हूं? कंसोल में पाठ प्रगति पट्टी मैं Angular 2 के घटकों के बीच डेटा कैसे साझा करूं? Html पाठ बॉक्स में कीबोर्ड कैरेट स्थिति सेट करें जावा में घुंघराले ब्रेसिज़ क्या मतलब है? पायथन में डेक कैसे कार्यान्वित हैं, और वे सूची से बदतर कब होते हैं?

डायलॉग के बाहर क्लिक के साथ संवाद को कैसे खारिज करें?

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

वेब के समाधान से एकत्रित समाधान "डायलॉग के बाहर क्लिक के साथ संवाद को कैसे खारिज करें?"

आप dialog.setCanceledOnTouchOutside(true); उपयोग कर सकते हैं dialog.setCanceledOnTouchOutside(true); जो संवाद बंद कर देगा यदि आप संवाद के बाहर स्पर्श करेंगे।

कुछ इस तरह,

  Dialog dialog = new Dialog(context) dialog.setCanceledOnTouchOutside(true); 

या यदि गैर-मॉडल में आपका संवाद तब,

1 – अपने संवाद की खिड़की विशेषता के लिए FLAG_NOT_TOUCH_MODAL सेट करें

 Window window = this.getWindow(); window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 

2 – खिड़कियों के गुणों में एक अन्य ध्वज जोड़ें, FLAG_WATCH_OUTSIDE_TOUCH – यह एक संवाद के लिए है जिसका स्पर्श दृश्य उसके दृश्य क्षेत्र के बाहर है।

3 – डायलॉग के onTouchEvent() और एक्शन टाइप की जांच करें। यदि क्रिया प्रकार ' MotionEvent.ACTION_OUTSIDE ' है, तो उपयोगकर्ता संवाद क्षेत्र के बाहर इंटरैक्ट कर रहा है। इसलिए इस मामले में, आप अपने संवाद को कम कर सकते हैं या तय कर सकते हैं कि आप क्या करना चाहते हैं। सादे निशान देखें?

 public boolean onTouchEvent(MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_OUTSIDE){ System.out.println("TOuch outside the dialog ******************** "); this.dismiss(); } return false; } 

अधिक जानकारी के लिए टच पॉइंट पर आधारित कस्टम डायलॉग को कैसे खारिज करें? और अपने गैर-मोडल संवाद को खारिज करने का तरीका, जब संवाद क्षेत्र के बाहर छुआ

आप ऑन-टचएवेंट के इस कार्यान्वयन का उपयोग कर सकते हैं। यह स्पर्श गतिविधि को गतिविधि के नीचे प्रतिक्रिया देने से रोकता है (जैसा कि उल्लेख किया गया है कि कैसे)

 @Override public boolean onTouchEvent ( MotionEvent event ) { // I only care if the event is an UP action if ( event.getAction () == MotionEvent.ACTION_UP ) { // create a rect for storing the window rect Rect r = new Rect ( 0, 0, 0, 0 ); // retrieve the windows rect this.getWindow ().getDecorView ().getHitRect ( r ); // check if the event position is inside the window rect boolean intersects = r.contains ( (int) event.getX (), (int) event.getY () ); // if the event is not inside then we can close the activity if ( !intersects ) { // close the activity this.finish (); // notify that we consumed this event return true; } } // let the system handle the event return super.onTouchEvent ( event ); } 

स्रोत: http://blog.twimager.com/2010/08/closing-activity-by-touching-outside.html

बस का उपयोग करें

 dialog.setCanceledOnTouchOutside(true); 

या, यदि आप अपनी शैली xml में परिभाषित थीम का उपयोग करके संवाद को कस्टमाइज़ कर रहे हैं, तो इस रेखा को अपनी थीम में रखें:

 <item name="android:windowCloseOnTouchOutside">true</item> 

dialog.setCanceledOnTouchOutside (सही);

स्पर्श के बाहर संवाद बंद करने के लिए

और अगर आप संपर्क के बाहर बंद करना चाहते हैं, तो नीचे का उपयोग करें

dialog.setCanceledOnTouchOutside (गलत);

इस पद्धति को पूरी तरह से ग्रे इवेंट के नीचे की गतिविधियों को क्लिक करने से रोकने चाहिए।

यदि आपके पास यह रेखा है तो निकालें :

 window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL); 

इसे आपकी गतिविधि पर डालें

 getWindow().setFlags(LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH); 

फिर इसके साथ टच ईवेंट को ओवरराइड करें

 @Override public boolean onTouchEvent(MotionEvent ev) { if(MotionEvent.ACTION_DOWN == ev.getAction()) { Rect dialogBounds = new Rect(); getWindow().getDecorView().getHitRect(dialogBounds); if (!dialogBounds.contains((int) ev.getX(), (int) ev.getY())) { // You have clicked the grey area displayYourDialog(); return false; // stop activity closing } } // Touch events inside are fine. return super.onTouchEvent(ev); } 

एक और समाधान इस कोड को Window एंड्रॉइड स्रोत कोड से छीन लिया गया था, आपको अपने संवाद स्रोत कोड में इस दो विधियों को जोड़ना चाहिए।

 @Override public boolean onTouchEvent(MotionEvent event) { if (isShowing() && (event.getAction() == MotionEvent.ACTION_DOWN && isOutOfBounds(getContext(), event) && getWindow().peekDecorView() != null)) { hide(); } return false; } private boolean isOutOfBounds(Context context, MotionEvent event) { final int x = (int) event.getX(); final int y = (int) event.getY(); final int slop = ViewConfiguration.get(context).getScaledWindowTouchSlop(); final View decorView = getWindow().getDecorView(); return (x < -slop) || (y < -slop) || (x > (decorView.getWidth()+slop)) || (y > (decorView.getHeight()+slop)); } 

इस समाधान में यह समस्या नहीं है:

यह महान काम करता है सिवाय इसके कि नीचे की गतिविधि भी टच ईवेंट पर प्रतिक्रिया देती है। क्या इसको रोकने के लिए कोई रास्ता है? – हैनेटल

आप यह कोशिश कर सकते हैं: –

 AlterDialog alterdialog; alertDialog.setCanceledOnTouchOutside(true); 

या

 alertDialog.setCancelable(true); 

और अगर आपके पास एक AlterDialog.Builder तो आप यह कोशिश कर सकते हैं: –

 alertDialogBuilder.setCancelable(true); 

यह कोड तब उपयोग के लिए उपयोग होता है जब संवाद बॉक्स पर क्लिक किया जाता है, उस समय छिपाता है, और जब उपयोगकर्ता संवाद बॉक्स के बाहरी पक्ष को क्लिक करता है तो उस समय दोनों सॉफ्टिनपूट और संवाद बॉक्स बंद होते हैं ……

  dialog = new Dialog(act) { @Override public boolean onTouchEvent(MotionEvent event) { // Tap anywhere to close dialog. Rect dialogBounds = new Rect(); getWindow().getDecorView().getHitRect(dialogBounds); if (!dialogBounds.contains((int) event.getX(), (int) event.getY())) { // You have clicked the grey area InputMethodManager inputMethodManager = (InputMethodManager) act .getSystemService(act.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(dialog .getCurrentFocus().getWindowToken(), 0); dialog.dismiss(); // stop activity closing } else { InputMethodManager inputMethodManager = (InputMethodManager) act .getSystemService(act.INPUT_METHOD_SERVICE); inputMethodManager.hideSoftInputFromWindow(dialog .getCurrentFocus().getWindowToken(), 0); } return true; } }; 

आप transparent सभी स्क्रीन आकार पर कब्जा कर लिया background बना सकते हैं और इसे dismiss करने के लिए onClick ईवेंट सुन सकते हैं।

कॉल संवाद .सेटन योग्य (गलत); आपकी गतिविधि / टुकड़ा से