2015-01-21 4 views
66

पर removeView() को कॉल करना होगा, मेरे ऐप में, मुझे अक्सर दो लेआउट के बीच स्विच करना होगा। नीचे पोस्ट किए गए लेआउट में त्रुटि हो रही है।निर्दिष्ट बच्चे के पास पहले से ही एक अभिभावक है। आपको बच्चे के माता-पिता पहले (एंड्रॉइड)

जब मेरा लेआउट पहली बार बुलाया जाता है, तो कोई त्रुटि नहीं होती है और सब ठीक है। जब मैं तो एक अलग लेआउट (एक खाली एक) कहते हैं और बाद में मेरी लेआउट दूसरी बार कहते हैं, यह मुझे निम्न त्रुटि देता है:

> FATAL EXCEPTION: main 
>  java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 

मेरे लेआउट-कोड इस तरह दिखता है:

tv = new TextView(getApplicationContext()); // are initialized somewhere else 
    et = new EditText(getApplicationContext()); // in the code 


private void ConsoleWindow(){ 
     runOnUiThread(new Runnable(){ 

    @Override 
    public void run(){ 

     // MY LAYOUT: 
     setContentView(R.layout.activity_console); 
     // LINEAR LAYOUT 
     LinearLayout layout=new LinearLayout(getApplicationContext()); 
     layout.setOrientation(LinearLayout.VERTICAL); 
     setContentView(layout); 

     // TEXTVIEW 
     layout.addView(tv); // <========== ERROR IN THIS LINE DURING 2ND RUN 
     // EDITTEXT 
     et.setHint("Enter Command"); 
     layout.addView(et); 
     } 
    } 
} 

मुझे पता है कि इस सवाल से पहले पूछा गया है, लेकिन यह मेरे मामले में मदद नहीं करता है।

उत्तर

197

त्रुटि संदेश कहता है कि आपको क्या करना चाहिए।

// TEXTVIEW 
if(tv.getParent()!=null) 
    ((ViewGroup)tv.getParent()).removeView(tv); // <- fix 
layout.addView(tv); // <========== ERROR IN THIS LINE DURING 2ND RUN 
// EDITTEXT 
23

मैं यहां अपने पुनर्चक्रण के साथ त्रुटि खोजने पर आया लेकिन समाधान काम नहीं किया (जाहिर है)। मैंने रीसाइक्लिंगव्यू के मामले में इसके कारण और समाधान लिखा है। उम्मीद है कि यह किसी की मदद करता है।

layoutInflater = LayoutInflater.from(context); 
return new VH(layoutInflater.inflate(R.layout.single_row, parent)); 

इसके बजाय यह

return new VH(layoutInflater.inflate(R.layout.single_row, null)); 
+3

कभी कभी यादृच्छिक जवाब जो वास्तव में पूछे जाने वाले प्रश्नों के जवाब नहीं हैं किसी और की मदद के रूप में गुजरती हैं। यह मेरे लिए काम किया। धन्यवाद! –

+0

अच्छा !, और यही कारण है कि लोगों को ज्यादातर बार "शून्य" को inflaters में 2 डी पैरामीटर के रूप में पास करना चाहिए। धन्यवाद। – superUser

+1

माता-पिता के लिए ज़िम्मेदार पैरामीटर में शून्य पास करना बुरा विचार नहीं है, लेकिन आपको यह जानना होगा कि इस मामले में बच्चे के दृश्य (जिसे आप फुलाते हैं) कुछ मामलों में इसे सही ढंग से मापने में सक्षम नहीं होंगे, क्योंकि यह करता है माता-पिता के बारे में कुछ भी नहीं पता। कुछ मामलों में यह काम करेगा लेकिन कुछ में नहीं होगा। – Sniper

0

होना चाहिए मैं एक समाधान मिल जाने:: यहाँ मैं

if (mView.getParent() == null) { 
        myDialog = new Dialog(MainActivity.this); 
        myDialog.setContentView(mView); 
        createAlgorithmDialog(); 
       } else { 
        createAlgorithmDialog(); 
       } 

त्रुटि अगर onCreateViewHolder() में निम्न विधि पीछा किया जाता है के कारण होता है अगर कोई नोटेंट माता-पिता था और यदि उसने नया डायलो नहीं बनाया है तो बस एक स्टेटमेंट जांच लें जी, सामग्री सेट करें और मेरे "createAlgorithmDialog()" विधि में संवाद दिखाएं।

यह ऑनक्लिक लिस्टेनर्स के साथ सकारात्मक और नकारात्मक बटन (ठीक है और रद्द बटन) भी सेट करता है।

1

मेरे मामले में समस्या इस तथ्य के कारण हुई थी कि मैं <merge> लेआउट के साथ मूल दृश्य को बढ़ा रहा था। इस मामले में, addView() दुर्घटना का कारण बन गया।

View to_add = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, true); 
// parent_layout.addView(to_add); // THIS CAUSED THE CRASH 

निकाल रहा addView() समस्या को हल करने में मदद की।

7

बस attachtoroot तर्क गलत

View view = inflater.inflate(R.layout.child_layout_to_merge, parent_layout, false); 
संबंधित मुद्दे

 संबंधित मुद्दे