"अलर्ट रूट के रूप में अशक्त गुजरने से बचें" चेतावनी जब AlertDialog द्वारा उपयोग के लिए दृश्य को फुलाया जाता है


126

मुझे लिंट चेतावनी मिलती है, Avoid passing null as the view rootजब विचारों को इस तरह से फुलाया nullजाता है parent, जैसे:

LayoutInflater.from(context).inflate(R.layout.dialog_edit, null);

हालांकि, दृश्य एक की सामग्री के रूप में इस्तेमाल किया जा रहा है AlertDialog, का उपयोग करते हुए setViewपर AlertDialog.Builderहै, इसलिए मैं नहीं जानता कि क्या के रूप में पारित किया जाना चाहिए parent

आपको क्या लगता है कि parentइस मामले में क्या होना चाहिए?


2
अशक्त के बजाय झूठी पास करें। देखना यह
MrDumb

अशक्त के बजाय आपको मूल लेआउट देने की कोशिश करें और फिर सेट-व्यू का उपयोग न करें।
हरेश छलाना

मैं विधि के लिए एक प्रकार का वृक्ष चेतावनी को दबाता हूं। मैंने अभी तक एक अच्छा कारण नहीं देखा है कि मुझे पास क्यों नहीं करना चाहिए null
३२३ एगो

4
मैं अभिभावक के दृष्टिकोण के आधार पर लेआउट के मुद्दे को समझता हूं, लेकिन यह वास्तव में एक AlertDialog के लिए लागू नहीं होता है जो अनिवार्य रूप से गतिविधि के पदानुक्रम के ऊपर तैरता है। इसीलिए आप पास हो सकते हैं null। एक कारण है कि आप लिंट को दबा सकते हैं। लिंट को अक्सर छूटे हुए मुद्दों के लिए आपको चेतावनी देना चाहिए; इस मामले में, यह सही आह्वान है।
323go

1
@ ashutiwari4 मैं रोज नई नई चीजें सीख रहा हूं .. सुंदर दुनिया: मैं
राहुल

जवाबों:


175

चेतावनी के बिना संवाद दृश्य को बढ़ाने के लिए इस कोड का उपयोग करें:

View.inflate(context, R.layout.dialog_edit, null);

7
@ MarianPa Mardzioch क्योंकि यह एक चेतावनी का कारण नहीं है। :-) बेशक, यह सवाल है कि लिंट कोड क्यों View.inflateऔर LayoutInflator.inflateअलग तरीके से व्यवहार करता है । मैंने निश्चित उत्तर नहीं देखा है। यह संबंधित हो सकता है कि एक ही दृश्य को बढ़ाने के दो समान तरीके क्यों हैं, जिसके लिए मैंने एक तर्क भी नहीं देखा है।
एडवर्ड ब्रे

12
ये गलत है। यह केवल चेतावनी को दबाता है, लेकिन समस्या अभी भी है। एक बेहतर समाधान के लिए संभव है ।mobile.com/ 2013/ 05/layout- inflation- as- intended पढ़ें ।
jcsahnwaldt

16
@JonaChristopherSahnwaldt क्या आप विस्तृत कर सकते हैं? लेख में कहा गया है कि AlertDialog का एक अशक्त अभिभावक होना चाहिए क्योंकि इसका मूल दृष्टिकोण नहीं है। मेरे लिए यह सुदृढ़ करने के लिए लगता है कि चेतावनी एक संवाद के बाहर के विचारों के लिए समझ में आता है, लेकिन एक संवाद दृश्य के लिए लागू नहीं है।
एडवर्ड ब्रे

7
@EdwardBrey आप सही हैं - मैंने लेख को पूरी तरह से नहीं पढ़ा है। इस विशेष मामले में, View.inflate(...null)या तो उपयोग करना ठीक है या @SuppressLint। सामान्य तौर पर, LayoutInflater.from(...).inflate(..., parent, false)बेहतर है। इस पर ध्यान दिलाने के लिए धन्यवाद!
jcsahnwaldt मोनिका

1
@ बायर कि अशक्त प्रश्न से बचने से उन मामलों के बारे में है जहां आपके माता-पिता हैं। यह प्रश्न उस बारे में है AlertDialog, जो किसी अभिभावक को इस विचार के लिए प्रेरित नहीं करता है। जब एक के मूल दृश्य को फुलाया जाता है AlertDialog, तो पासिंग नल सही होता है। लिंट इस विशेष संदर्भ के लिए जिम्मेदार नहीं है, इसलिए यह चेतावनी देता है यदि आप उस फ़ंक्शन का उपयोग करते हैं जो parentएक झूठी सकारात्मक लेता है, तो कुछ भी त्रुटि का संकेत नहीं। इसलिए यह इस मामले में मान्य है कि फ़ंक्शन का उपयोग करें जो बिना parentकिसी चेतावनी के चलाता है और ट्रिगर करता है।
एडवर्ड ब्रे

35

लघुकथा यह है कि जब आप किसी संवाद के लिए एक दृश्य प्रस्तुत कर रहे हैं, parentतो अशक्त होना चाहिए, क्योंकि यह दृश्य मुद्रास्फीति के समय पर ज्ञात नहीं है। इस मामले में, चेतावनी से बचने के लिए आपके पास तीन बुनियादी उपाय हैं:

  1. @Suppress का उपयोग करके चेतावनी को दबाएं
  2. व्यू की इनफ्लो विधि का उपयोग करके व्यू को इनफ्लो करें । यह एक LayoutInflater के आसपास सिर्फ एक आवरण है, और ज्यादातर सिर्फ समस्या को हल करता है।
  3. LayoutInflater का उपयोग देखें बढ़ पूर्ण विधि : inflate(int resource, ViewGroup root, boolean attachToRoot)। सेट attachToRootकरें false। यह इनफ़्लो को बताता है कि माता-पिता उपलब्ध नहीं हैं। एंड्रॉइड लिंट के पुराने संस्करणों में, इसने चेतावनी को हटा दिया। एंड्रॉइड स्टूडियो के 1.0 संस्करणों के बाद अब ऐसा नहीं है।

इस मुद्दे की एक बड़ी चर्चा के लिए http://www.doubleencore.com/2013/05/layout-inflation-as-intended/ देखें , विशेष रूप से अंत में "हर नियम में एक अपवाद है" अनुभाग।


19

ViewGroup के रूप में कास्टिंग अशक्त चेतावनी को हल:

View dialogView = li.inflate(R.layout.input_layout,(ViewGroup)null);

वस्तु कहां liहैLayoutInflater's


जहां 'ली' लेआउटइनफ्लेटर ऑब्जेक्ट है।
एसवीएल नरसिम्हम

3
यह उत्तर सबसे अच्छा है, आपको यह समझने में मदद करता है कि आप वास्तव में ऐसा क्यों कर रहे हैं। लघु कहानी, जैसा कि आप पहले ही पढ़ चुके हैं, यह है कि AlertDialog अपने माता-पिता को फुलाते समय नहीं जानता है, और इसलिए यह एक दुष्प्रभाव है कि लिंट इस सटीक स्थिति में एक चेतावनी फेंकता है जब आप वास्तव में सही काम कर रहे होते हैं।
मार बार

मैंने इस चेतावनी के बारे में अनगिनत उत्तर और पेज पढ़े हैं, लेकिन आपका समाधान अब तक का सबसे अच्छा है: सरल और सुरुचिपूर्ण
कौटिल्य

9
लेकिन यह निरर्थक कास्टिंग है
मोहित

11
फिर हमें एक और चेतावनी मिलती है "कास्टिंग बेमानी है"!
मौसा

17

आपको उपयोग करना चाहिए AlertDialog.Builder.setView(your_layout_id), इसलिए आपको इसे बढ़ाने की आवश्यकता नहीं है।

AlertDialog.findViewById(your_view_id)संवाद बनाने के बाद उपयोग करें ।

अंदर और फिर (AlertDialog) dialogInterfaceपाने के लिए उपयोग करें ।dialogOnClickListenerdialog.findViewById(your_view_id)


1
जाने का यह रास्ता है! बस संवाद बनाएं और फिर अपना दृष्टिकोण खोजें।
user1806772

1
यह इसे करने का एक अच्छा तरीका है, हालाँकि याद रखें कि यह विधि एपीआई 21 में जोड़ी गई थी
निकोलस कैरास्को

क्या होगा यदि हम इस फुलाए हुए लेआउट को कुछ चर में संग्रहित करें? उदाहरण के लिए, मैंने एक वर्ग लिखा है Aजिसमें विधि है onCreateDialog। उत्तरार्द्ध में, मैंने कहा कि कहां कहा गया है alert_dialog_builder.setView(R.layout.edit_account_dialog);। लेकिन मुझे इस फुलाए हुए लेआउट को Aनामित विशेषता चर में संग्रहीत करना होगा the_inflated_layout_of_the_dialog
जर्सऑफजम-शेड्यूलर

9

आपको parentकिसी संवाद के लिए निर्दिष्ट करने की आवश्यकता नहीं है ।

@SuppressLint("InflateParams")ओवरराइड के शीर्ष पर इस का उपयोग करें ।


7

जब आपके पास वास्तव में कोई नहीं है parent(उदाहरण के लिए दृश्य बनाने के लिए AlertDialog), तो आपके पास पास होने के अलावा कोई अन्य विकल्प नहीं है null। तो चेतावनी से बचने के लिए ऐसा करें:

final ViewGroup nullParent = null;
convertView = infalInflater.inflate(R.layout.list_item, nullParent);

4
यह एक और चेतावनी पैदा करता है "मूल्य 'अशक्त' हमेशा शून्य होता है।"
मल्लाउद्दीन

AndroidStudio 3.3 और API 28 के रूप में, यह काम करने वाला एकमात्र समाधान है।
जीशान

1
  1. AlertDialog जहाँ तक मुझे पता है एक ही मामला था कि आप सुरक्षित रूप से मूल दृश्य के बजाय अशक्त उपयोग कर सकते हैं । इस स्थिति में आप उपयोग करके चेतावनी को दबा सकते हैं:

    @SuppressLint ( "InflateParams")

  2. सामान्य तौर पर आपको चेतावनी से छुटकारा पाने के लिए कभी भी सुप्रेसलिंट या अन्य जवाबों में बताए गए वर्कअराउंड का उपयोग नहीं करना चाहिए। अभिभावक दृश्य लेआउट परिमों का मूल्यांकन करने के लिए आवश्यक है जो दृश्य के मूल तत्व में घोषित किए जाते हैं। इसका मतलब है कि यदि आप मूल दृश्य के बजाय अशक्त का उपयोग करते हैं, तो रूट तत्व के सभी लेआउट परमेस को अनदेखा किया जाएगा और डिफ़ॉल्ट लेआउट पार्म्स द्वारा प्रतिस्थापित किया जाएगा। ज्यादातर समय यह ठीक रहेगा, लेकिन कुछ मामलों में इसका परिणाम वास्तव में कठिन-से-बग ढूंढना होगा।


0

के प्रलेखन से View.inflate()यह कहता है

XML संसाधन से कोई दृश्य देखें। यह सुविधा पद्धति LayoutInflaterक्लास को लपेटती है , जो मुद्रास्फीति को देखने के लिए विकल्पों की एक पूरी श्रृंखला प्रदान करती है।

  @param context The Context object for your activity or application.
  @param resource The resource ID to inflate
  @param root A view group that will be the parent.  Used to properly inflate the  layout_* parameters.

0

Https://developer.android.com/guide/topics/ui/dialogs के अनुसार

डायलॉग के लिए लेआउट को इनफ्लो करें और सेट करें
क्योंकि यह पेरेंट व्यू में डायलॉग लेआउट में जा रहा है

इसलिए, AlertDialog बनाने के लिए, मैं उपयोग करता हूं @SuppressLint("InflateParams")

LayoutInflater inflater = requireActivity().getLayoutInflater();
@SuppressLint("InflateParams")
View view = inflater.inflate(R.layout.layout_dialog, null);
builder.setView(view);

-1

करने के बजाय

view = inflater.inflate(R.layout.list_item, null);

करना

view = inflater.inflate(R.layout.list_item, parent, false);

यह दिए गए माता-पिता के साथ इसे फुलाएगा, लेकिन इसे माता-पिता के साथ संलग्न नहीं करेगा।

कोएफ़ेक्ट के लिए बहुत धन्यवाद ( उनकी पोस्ट का लिंक )


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