DialogFragment setCelelable संपत्ति काम नहीं कर रही है


101

मैं एक एंड्रॉइड एप्लिकेशन में काम कर रहा हूं और एक डायलॉग दिखाने के लिए डायलॉगफ्रेगमेंट का उपयोग कर रहा हूं और मैं उस डायलॉगफ्रैगमेंट को रद्द नहीं करना चाहता हूं। मैंने डायलॉग को रद्द करने योग्य संपत्ति को झूठा बना दिया है, लेकिन फिर भी इसका कोई असर नहीं हो रहा है।

कृपया मेरे कोड को देखें और मुझे एक समाधान सुझाएं।

public class DialogTest extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        return super.onCreateDialog(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.dialog_test, container, true);
        getDialog().requestWindowFeature(STYLE_NO_TITLE);
        getDialog().setCancelable(false);

        return view;
    }
 }

28
इसके बजाय getDialog ()। setCancelable (गलत); आपको सेटैन्सेबल (झूठा) कॉल करना चाहिए;
ब्लैकबेल्ट

यदि आप संवाद की सीमा के बाहर क्लिक करते हैं तो उसे भी हटा दिया जाना चाहिए?
उस्मान कुर्द

? आप आइसक्रीम सैंडविच में कोशिश कर रहे हैं लिंक का संदर्भ लें उल्लेख fantasypublishings.com/morePhpHelp/...
Remmyabhavan

जवाबों:


238
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.dialog_test, container, true);
    getDialog().requestWindowFeature(STYLE_NO_TITLE);
    getDialog().setCancelable(false);

    return view;
}

के बजाय getDialog().setCancelable(false); आपको सीधे उपयोग करना होगाsetCancelable(false);

तो अद्यतन जवाब इस तरह होगा

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.dialog_test, container, true);
    getDialog().requestWindowFeature(STYLE_NO_TITLE);
    setCancelable(false);

    return view;
}

यह वास्तव में अविश्वसनीय टिप है, धन्यवाद। मुझे आश्चर्य है कि क्यों डायलॉग .getWindow () के साथ। requestFeature (-) आपको getWindow पर "संवाद शामिल करना" है?
फटी

7
यह कोई टिप नहीं है। एक टुकड़ा आपके संवाद को लपेट रहा है, यह सामान्य है कि आपको स्वयं संवाद के बजाय टुकड़े से निपटना होगा;)
andrea.rinaldi

1
यदि आप onCreateView को ओवरराइड नहीं करते हैं, तो setCancelable (झूठा) को पब्लिक डायलॉग
onCreateDialog

2
मेरे लिए काम नहीं कर रहा है। डायलॉग बैक बटन पर क्लिक करने पर भी खारिज हो जाता है।
पिंकेश दरजी

@Blackbelt मेरे पास एक समान उपयोग का मामला है लेकिन मेरे मामले में संवाद के बाहर एक स्पर्श संवाद को खारिज नहीं कर रहा है। मैं DialogFragment के भीतर एक DatePicker का उपयोग कर रहा हूं। मैं आपके उत्तर में "R.layout.dialog_test" के लिए क्या उपयोग करूंगा? मेरा पूरा प्रश्न यहाँ सूचीबद्ध है: stackoverflow.com/questions/59825258/…
AJW

51

निम्नलिखित स्निपेट का उपयोग करें

void showDialog() {
    DialogFragment newFragment = MyAlertDialogFragment.newInstance(
            R.string..alert_dialog_two_buttons_title);
    newFragment.setCancelable(false);
    newFragment.show(getFragmentManager(), "dialog");
}

और अगर आप डायलॉग के आसपास आउट साइड टच को डिसेबल करना चाहते हैं तो कोड की निम्नलिखित लाइन का उपयोग करें

DialogFragment.getDialog().setCanceledOnTouchOutside(true);

1
यह स्वीकृत उत्तर होना चाहिए क्योंकि यह वैनिला अलर्ट संवाद टुकड़े और कस्टम संवाद टुकड़े दोनों के लिए लागू है।
गणेश मोहन

29

मामले में आप बनाने में मदद अपने संवाद को सतर्क निर्माता का उपयोग (और शायद हर मामले में आप एक DialogFragment अंदर संवाद लपेट), getDialog () का उपयोग करें नहीं। SetCancelable (गलत) या Dialog.setCancelable (गलत) है क्योंकि यह करने के लिए नहीं जा रहा है काम। नीचे दिए गए कोड के अनुसार सेटैक्लेबल (झूठा) का उपयोग करें क्योंकि यह एंड्रॉइड डॉक्यूमेंटेशन में उल्लिखित है:

public void setCancelable (boolean cancelable)

एपीआई स्तर 11 में जोड़ा गया है कि क्या दिखाया गया डायलॉग रद्द करने योग्य है। सीधे डायलॉग.सेटक्लेबल (बूलियन) बुलाने के बजाय इसका उपयोग करें, क्योंकि डायलॉगफ्रेगमेंट को इसके आधार पर अपने व्यवहार को बदलने की जरूरत है। "

रेफरी: http://developer.android.com/reference/android/app/DialogFragment.html#setCancelable(boolean)

public class MyDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {

        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.dialog_layout, null, false);
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
                .setTitle("in case you want use a title").setView(view);

        AlertDialog alert = builder.create();
        // alert.setCancelable(false); <-- dont' use that instead use bellow approach
        setCancelable(false); <-  press back button not cancel dialog, this one works fine
        alert.setCanceledOnTouchOutside(false); <- to cancel outside touch

        return alert;
}

हां, मैं उपरोक्त समाधान की कोशिश करता हूं, यहां तक ​​कि चेक किया हुआ भी, लेकिन मेरे लिए काम नहीं करता है, यह उत्तर नया है इसलिए इसे अपटेड करने के लिए समय की आवश्यकता है, वैसे भी धन्यवाद।
क्सिऑन

वैसे यह सच है, भले ही मुझे लगता है कि एंड्रॉइड की तरफ से यह व्यवहार काफी अजीब है, जैसा कि आप स्पष्ट रूप से उदाहरण के लिए AlertDialog.Builder का उपयोग करते हैं, अपने संवाद का निर्माण करने के लिए, आपको लगता है कि उन विशेषताओं को उपवर्ग ओवरराइड करता है। लेकिन मुझे शायद यहाँ कुछ याद आ रहा है?
रॉबर्ट

मुझे लगता है कि संवाद व्यवहार के बाद डायलॉगफ्रेम में लिपटे रहने के बाद एलर्टडायलॉग का जवाब नहीं है या बड़े स्तर पर नहीं है। मुझे लगता है कि सभी इसके बजाय विखंडन से गुजरता है।

धन्यवाद! मैं अलर्ट का उपयोग कर रहा था। Cancelelable (झूठा) यह सब करते हुए और यह नहीं समझ सका कि यह काम क्यों नहीं करेगा।
एल्डो

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