डायलॉग में बैक बटन कैसे हैंडल करें?


95

मैं एक एप्लिकेशन विकसित कर रहा हूं कि जब बटन दबाया जाता है, तो यह ओके और रद्द बटन के साथ एक संवाद खोलता है।

यह बढ़िया काम करता है।

जब उपयोगकर्ता बैक बटन दबाता है, तो मैं इसे निम्नानुसार संभाल रहा हूं

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if ((keyCode == KeyEvent.KEYCODE_BACK)) 
    {

    }
 return super.onKeyDown(keyCode, event);
}

लेकिन उपरोक्त विधि को नहीं कहा जाता है। इससे मैं किस तरह निपट सकता हूं?


1
क्या आप चाहते हैं कि उपयोगकर्ता संवाद को रद्द करने में सक्षम हो? या आपका onKeyDown हिस्सा क्या करता है?
क्रुगर

@ चीनन :: क्या आप थोड़ा और स्पष्ट हो सकते हैं ??
KMI

जवाबों:


238
dialog.setOnKeyListener(new Dialog.OnKeyListener() {

            @Override
            public boolean onKey(DialogInterface arg0, int keyCode,
                    KeyEvent event) {
                // TODO Auto-generated method stub
                if (keyCode == KeyEvent.KEYCODE_BACK) {
                    finish();
                    dialog.dismiss();
                }
                return true;
            }
        });

8
खारिज करने की कोई आवश्यकता नहीं है Dialog; finish()इस बात का ख्याल पहले से ही है। इसके अलावा, इस विधि falseको अन्य जगहों पर प्रमुख घटनाओं पर कब्जा करने में सक्षम होना चाहिए
slinden77

6
मुझे लगता है कि नीचे एलेक्सा का जवाब एक बेहतर विकल्प है।
साइमन फोर्सबर्ग

23
मैंने && event.getAction() == KeyEvent.ACTION_UPजवाब में जोड़ा । इसके बिना, कोड ब्लॉक को दो बार निष्पादित किया जाएगा। (कुंजी नीचे और कुंजी उत्तर प्रदेश)। इस उदाहरण में यह इतना महत्वपूर्ण नहीं है, लेकिन खत्म () के अलावा अन्य कार्यों के लिए, यह बहुत महत्वपूर्ण हो सकता है।
Udo Klimaschewski

1
@dmmh अगर आप कॉल नहीं करते हैं तो dialog.dismiss()मेमोरी लीक हो जाएगी।
CONvid19

2
मुझे यकीन है कि आप सही हैं, लेकिन उस स्थिति में finish()और dialog.dismiss()उपरोक्त कोड में स्विच किया जाना चाहिए।
slinden77

115

जब आप डायलॉग बनाते हैं तो लगता है कि आप ऑनकैंसलिस्टनर सेट करना चाहते हैं। यह इस तरह दिख रहा है:

dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {         
    @Override
    public void onCancel(DialogInterface dialog) {
        //do whatever you want the back key to do
    }
});

7
यह निश्चित रूप से सबसे अच्छा जवाब है। अच्छा और सरल। KeyEvent का पता लगाने की जरूरत नहीं है। उत्तम।
लार्जग्लास 16

2
मुझे पता है कि मुझे बहुत देर हो चुकी है, लेकिन मैंने कुछ इशारा किया। जब उपयोगकर्ता संवाद के बाहर कहीं क्लिक करता है, तो यह अतिरिक्त रूप से भी ट्रिगर हो जाएगा। इसलिए यदि आपको केवल बैक प्रेस विकल्प को ओवरराइड करने की आवश्यकता है तो यह वह नहीं है जो आप खोज रहे हैं।
user2520215

5
@ user2520215 यदि आप यह नहीं चाहते हैं कि जब उपयोगकर्ता संवाद के बाहर क्लिक करे, तो आपको Dial.setCanceledOnTouchOutside (झूठा) सेट करना चाहिए। यह निश्चित रूप से बेहतर जवाब है।
अल्हसन अब्दुलकादिर

इशारा करने के लिए धन्यवाद। यह निश्चित रूप से एक बेहतर दृष्टिकोण है।
user2520215

3
यदि कस्टम दृश्य का उपयोग किया जाता है, तो यह काम नहीं करता है (यानी संवाद नहीं बना रहा है, लेकिन डायलॉगफ्रैगमेंट से सिर्फ इनहेरिंग करता है) जबकि प्रमुख श्रोता उस स्थिति में काम करता है।
जूलियन होनमा

19

आपको OnCancelविधि को ओवरराइड करने की आवश्यकता है । यह तरीका बैक की प्रेस पर कॉल करता है। यहाँ कोड है जो मेरे लिए सही काम करता है।

 AlertDialog alertDialog;

    alertDialog.setOnCancelListener(new OnCancelListener() 
    {                   
           @Override
            public void onCancel(DialogInterface dialog) 
             {
               // TODO Auto-generated method stub

                    dialog.dismiss();                           

            }
}); 

आशा है कि यह आपकी मदद करेगा, और यदि यह आपके लिए सहायक है तो इसे स्वीकार करें।

धन्यवाद..


7

इसे इस्तेमाल करे

 new AlertDialog.Builder(this).setOnKeyListener(new DialogInterface.OnKeyListener() {

                        @Override
                        public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {

                            if(keyCode == KeyEvent.KEYCODE_BACK){
                                Logger.d(TAG, "--------- Do Something -----------");
                                return true;
                            }
                            return false;


                        }
                    })

1
मैं बिल्डर में setOnCancelListener का उपयोग क्यों नहीं कर सकता?
15

2

यदि आप एक DialogFragment का उपयोग कर रहे हैं, तो जो मैं इसे करने का सही तरीका बता सकता हूं , वह ऑनसेल () को ओवरराइड करना है

मैंने देखा कि setOnCancelListenerकाम नहीं करता है, और setOnKeyListenerकाम करता है, लेकिन मेरे लिए मजेदार पक्ष प्रभाव है कि यह सभी कुंजियों को निगलता है यदि आपके संवाद में एक संपादित पाठ है।


1

ऐसा इसलिए है क्योंकि जब आपका डायलॉग खुलता है तो आपकी विंडो डायलॉग पर केंद्रित होती है। इसलिए अब आपको keyअपने डायलॉग को संभालना होगा ।


हालांकि सही है, यह जवाब बहुत जानकारीपूर्ण नहीं keyहै कि डायलॉग को कैसे संभालना है।
सिमोन फोर्सबर्ग

1

onBackPressed()अपने स्वयं के संवाद में विधि को ओवरराइड करें और अपने कोड में इसका उपयोग करें:

public class MyDialog extends Dialog {

    public MyDialog(@NonNull Context context) {
        super(context);
    }

    @Override
    public void onBackPressed() {
        // Do what you want
    }
}

उपयोग:

MyDialog dlg = new MyDialog(context);
dlg.show();

0

यह कोड काम करता है:

    Dialog dlg = new Dialog(thisAct, R.style.DialogTheme);
    dlg.setContentView(view);
    dlg.setCancelable(false);
    dlg.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD_DIALOG);
    dlg.setOnKeyListener((arg0, keyCode, event) -> {
        Timber.d("onKey(%d)", keyCode);
        //{home intercepting
        if ((keyCode == KeyEvent.KEYCODE_HOME)) {
            Timber.i("HOME pressed");
            return true;
        }

        return true;
    });
    dlg.show();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.