डायलॉग के बाहर दबाने पर डायलॉगफ्रेगमेंट कैसे खारिज करें?


80

मैं एक का उपयोग कर रहा हूं DialogFragment, और जब मैंने सफलतापूर्वक एक छवि को बंद करने के लिए (यानी खारिज कर दिया) संवाद को दबाया है, तो मुझे संवाद को खारिज करने का एक कठिन समय मिल रहा है जब उपयोगकर्ता इसके बाहर कहीं भी क्लिक करता है, जैसे कि यह साथ काम करता है सामान्य संवाद। मैंने सोचा था कि किसी तरह का होगा

dialogFragment.setCanceledOnTouchOutside(true);

कॉल करें, लेकिन मैं दस्तावेज में नहीं देखता हूं।

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

जवाबों:


177
DialogFragment.getDialog().setCanceledOnTouchOutside(true);

में बुलाया जाना चाहिए onCreateView(जैसा कि अपूर्व गुप्ता ने बताया)।


34
में बुलाया जाना चाहिएonCreateView
अपूर्वा गुप्ता

क्या होगा अगर मैं इसे रद्द नहीं करना चाहता, लेकिन इसके बजाय बस करीब?
jjxtra

58
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       ...
       getDialog().setCanceledOnTouchOutside(true);
       ... 
       }

в моем случае getDialog ()। setCanceledOnTouchOutside (true); не сработало, сработало getDialog ()। खारिज ();
Максим Фомичав

@ МаксимФомичёв, первом случае происходит установка свойства диалога, что его межно закрывать нажатием снаружи। यह बहुत अच्छा है
कूलमाइंड

21
    /** The system calls this only when creating the layout in a dialog. */
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        // The only reason you might override this method when using onCreateView() is
        // to modify any dialog characteristics. For example, the dialog includes a
        // title by default, but your custom layout might not need it. So here you can
        // remove the dialog title, but you must call the superclass to get the Dialog.
        Dialog dialog = super.onCreateDialog(savedInstanceState);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setCanceledOnTouchOutside(true);

        return dialog;
    }

यह मेरे लिए काम नहीं किया। मैं फोन करने के लिए किया था setCanceledOnTouchOutsideमें onCreateView@Apurv के अनुसार। मुझे लगता है कि मैं कहा जाता है का उल्लेख करना चाहिएsetCanceledOnTouchOutside(false)
kimbaudi

8

उत्तर के बहुत सारे लेकिन, संवाद खुलने पर ऐप क्रैश हो जाता है। getDialog().setCanceledOnTouchOutside(true);अंदर लिखने से onCreateViewकाम नहीं चला और मेरा ऐप क्रैश हो गया।

(मैं AppCompatActivityअपने BaseActivity और android.app.DialogFragmentमेरे Fragment के रूप में उपयोग कर रहा हूं)।

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

getDialog ()। setCanceledOnTouchOutside (सच);

या

it.getDialog ()। setCanceledOnTouchOutside (true);

अंदर onActivityCreatedजैसा

@Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        //getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogAnimationZoom;
        //getDialog().getWindow().setDimAmount(0.85f);
        getDialog().setCanceledOnTouchOutside(true);//See here is the code
    }

क्या उपयोग नहीं करना है:

DialogFragment.getDialog ()। SetCanceledOnTouchOutside (false);

त्रुटि के बाद फेंकता है

यहाँ छवि विवरण दर्ज करें

और onCreateViewएप्लिकेशन को क्रैश करने में कोड लिखना ! यदि आपको कुछ गलत लगता है तो कृपया उत्तर को अपडेट करें।


संभवतः यह इसलिए है क्योंकि आप अंदर एक संवाद बनाते हैं onCreateDialog(), जहां यह आरंभीकरण का एक सामान्य तरीका है। इस मामले onCreateView()में कुछ भी नहीं है और यहां तक ​​कि एक दृश्य भी शामिल नहीं है। आप कोड को स्थानांतरित करने का प्रयास कर सकते हैं onCreateDialog()
कूलमाइंड

@CoolMind ओह, यह एक अच्छा अवलोकन है। इसे मेरी कोशिश सूची में जरूर रखेंगे। धन्यवाद!
सूद 7०००

मुझे लगता है, आपका जवाब, फिर भी, संत बनाता है, और 4 लोगों ने प्लसस को चिह्नित किया है। मैं भी साथ समस्याओं का अनुभव onCreateDialog, onCreateViewके पास अतीत में। हो सकता है कि मैं गलत हूं, और आपको बनाए रखना चाहिए onActivityCreated, यह अतिरिक्त आरंभीकरण करने के लिए एक अच्छा तरीका है (देखें stackoverflow.com/a/50734566/2914140 , उदाहरण के लिए)।
कूलमाइंड

@CoolMind अच्छा है जो आपके लिए काम करता है। लेकिन मैं यह नोटिस कर सकता हूं कि, जो समस्याएं आप अनुभव कर रहे हैं, वे आपके BottomSheetकार्यान्वयन के कारण हैं । हो सकता है कि मैं BSheet I सहमत हूं। लेकिन एक के लिए यह समाधान DialogFragmentअच्छी तरह से काम करता है।
सुद 22००7

3
DialogFragment.getDialog().setCanceledOnTouchOutside(false);

यह गलत समझ रहा था। मुझे भी यही समस्या थी। Android मोनो के लिए जावा और मोनो के लिए यह ठीक काम करेगा:

this.getDialog().SetCanceledOnTouchOutside(false);

लेकिन मोनो के बारे में कुछ भी किसने पूछा? : /
m0skit0

1
            Dialog.SetCanceledOnTouchOutside(true);


मेरे लिए मेरा कोड काम किया

class dlgRegister : DialogFragment
        {
    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
            {
    ....
    ....
    }
    public override void OnActivityCreated(Bundle savedInstanceState)
            {
                Dialog.Window.RequestFeature(WindowFeatures.NoTitle);
                Dialog.SetCanceledOnTouchOutside(true);
                base.OnActivityCreated(savedInstanceState);
                Dialog.Window.Attributes.WindowAnimations =    Resource.Style.dialog_animation;
            }
    }

1

यदि आप बाहर से क्लिक करते समय कुछ तर्क निष्पादित करना चाहते हैं DialogFragment, तो बस ऑनकाेल विधि को ओवरराइड करें।

override fun onCancel(dialog: DialogInterface) {
    super.onCancel(dialog)
    // Do your work here
}

0

मैं उपरोक्त समाधान आज़माने के बाद ही अपने समाधान का उपयोग करने की सलाह दूंगा। मैंने यहाँ अपना समाधान बताया है । बस संक्षेप में, मैं DialogFragment.getView () के स्पर्श सीमा की जाँच कर रहा हूँ। जब टच पॉइंट डायलॉगफ्रेग्मेंट के बाहर हैं, मैं डायलॉग को खारिज कर रहा हूं।

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