2012-02-06 18 views
9

पर removeView() को कॉल करना होगा, मुझे पता है कि इस त्रुटि के बारे में पूछे जाने वाले दर्जनों प्रश्न हैं, लेकिन प्रस्तावित समाधानों में से कोई भी मेरी समस्या पर लागू नहीं होता है, कम से कम मैं देखता हूं।एंड्रॉइड - निर्दिष्ट बच्चे के पास पहले से ही एक अभिभावक है। आपको बच्चे के माता-पिता को पहले

यहाँ मेरी लॉग है:

java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
    at android.view.ViewGroup.addViewInner(ViewGroup.java:1976) 
    at android.view.ViewGroup.addView(ViewGroup.java:1871) 
    at android.view.ViewGroup.addView(ViewGroup.java:1851) 
    at com.android.internal.app.AlertController.setupView(AlertController.java:365) 
    at com.android.internal.app.AlertController.installContent(AlertController.java:206) 
    at android.app.AlertDialog.onCreate(AlertDialog.java:251) 
    at android.app.Dialog.dispatchOnCreate(Dialog.java:307) 
    at android.app.Dialog.show(Dialog.java:225) 
    at com.company.MyApp.MyActivity$7.onItemClick(MyActivity.java:240) 
    at android.widget.AdapterView.performItemClick(AdapterView.java:284) 
    at android.widget.ListView.performItemClick(ListView.java:3513) 
    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1812) 
    at android.os.Handler.handleCallback(Handler.java:587) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:130) 
    at android.app.ActivityThread.main(ActivityThread.java:3683) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:507) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    at dalvik.system.NativeStart.main(Native Method) 

यहाँ MyActivity.java onCreate है()। आप देख सकते हैं कि एक संवाद निर्माता दिखाया गया है और कुछ मान दिए गए हैं। दोनों myDialogLayout और myDialogBuilder निजी वर्ग के सदस्यों

@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    // ... a bunch of init code... 

    // Create a dialog builder 
    myDialogLayout = getLayoutInflater().inflate(R.layout.leaving, null); 
    myDialogBuilder = new AlertDialog.Builder(this) 
     .setTitle("My Title") 
     .setView(myDialogLayout) 
     .setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
     { 
      public void onClick(DialogInterface dialog, int which) {} 
     }); 

    // ... more code ... 
} 

बाद में, जब एक निश्चित बटन मेरे गतिविधि में क्लिक किया जाता है, myDialogBuilder थोड़ा अनुकूलित है और फिर एक संवाद बनाया है और दिखाया गया है कर रहे हैं।

// Builder customized a bit 
myDialogBuilder 
    .setMessage("custom message here"); 

// Dialog created from Builder 
myDialog = myDialogBuilder.create(); 

// Dialog shown 
myDialog.show(); // <---- MyActivity.java Line: 240 

तो मेरी समस्या पर, जब मैं अपने बटन क्लिक करें, संवाद सफलतापूर्वक बनाया गया है: myDialog एक निजी वर्ग चर/सदस्य है। लेकिन जब मैं संवाद पर रद्द करता हूं और फिर बटन दबाता हूं, तो मुझे लॉग में दिखाई देने वाली त्रुटि मिलती है। किसी कारण से, गतिविधि मुझे अपने myDialog संवाद का पुन: उपयोग नहीं करना चाहती है। यह एक वर्ग सदस्य है, इसलिए यह onClick हैंडलर से पहुंच योग्य है। और myDialog हर बार बटन क्लिक होने पर एक नया संवाद होता है, क्योंकि यह हर बार myDialogBuilder.create() द्वारा स्क्रैच से बनाया गया है।

कोई भी जानता है कि समस्या क्या है? जब मैंने रद्द बटन दबाया था तो मैंने myDialog.dismiss() में जोड़ने का भी प्रयास किया लेकिन इससे कोई फर्क नहीं पड़ता।

इसके अलावा, आप मेरे myDialogBuilder में देख सकते हैं कि संवाद के दृश्य के लिए एक कस्टम एक्सएमएल लेआउट का उपयोग किया जाता है। त्रुटि संदेश के अनुसार, ऐसा लगता है कि यह संवाद में उपयोग किए जाने से दृश्य को हटाने के लिए मुझे removeView() का उपयोग करना चाहता है। लेकिन myDialogBuilder.removeView() मान्य विधि नहीं है।

उत्तर

17

myDialogLayout एक वर्ग सदस्य चर है? यदि ऐसा है तो पहली बार जब आप संवाद दिखाते हैं तो पहले से ही एक अभिभावक होता है तो आप एक दूसरा संवाद बनाते हैं जो myDialogLayout के माता-पिता होने का भी प्रयास करता है। प्रत्येक बार जब आप संवाद खोलते हैं तो myDialogLayout का नया उदाहरण बनाने का प्रयास करें।

+2

वह कुंजी थी।मैंने 'myDialogLayout' को क्लास सदस्य चर होने से हटा दिया और इसके बजाय इसे' ऑनक्लिक 'हैंडलर विधि में स्थानीय बना दिया। इस तरह यह एक नया लेआउट है जो हर बार फुलाया जाता है। धन्यवाद! –

3

यह एक प्राथमिक उदाहरण है कि onCreateDialog() onPrepareDialog() विधियों का उपयोग क्यों किया जाता है।

यदि आप अपने बटन दबाए जाने पर हर बार myDialog को तुरंत चालू कर रहे हैं, तो आप पहले बनाए गए संवाद ऑब्जेक्ट (पुराने पैरेंट) से नए संवाद में दृश्य संलग्न करने का प्रयास कर रहे हैं।

एक संवाद जो तत्काल, दिखाया गया और खारिज कर दिया गया है, केवल फिर से दिखाया जाना चाहिए, पूरी तरह से पुनर्निर्मित नहीं किया जाना चाहिए।

मान लें कि myDialog एक वर्ग सदस्य है, यह जांचने का प्रयास करें कि मेराDialog पहले शून्य है या नहीं। यदि शून्य नहीं है, तो इसे पूरी तरह से तत्काल करने के बजाय इसे फिर से दिखाएं।

संपादित करें - ऑनपेरेडियल() और ऑनक्रेट डायलॉग() पर उपयोग करने का मेरा उदाहरण यहां दिया गया है। बनाएँ पर संवाद बनाता है, और प्रत्येक बार जब यह दिखाया जाता है, तो यह तैयार होता है और findViewById का उपयोग करके एक संपादन टेक्स्ट संदर्भ प्राप्त किया जाता है और पाठ साफ़ हो जाता है। हम यहां मान रहे हैं कि DIALOG_TEST एक पूर्णांक निरंतर है, और लेआउट/dialog_test.xml में आईडी edittext के साथ एक संपादन टेक्स्ट दृश्य है।

@Override 
protected void onPrepareDialog(int id, Dialog dialog) { 

    switch(id){ 

    case DIALOG_TEST: 

     EditText mEditText = (EditText) dialog.findViewById(R.id.edittext); 
     mEditText.setText(""); 
     break; 
    } 

} 

@Override 
protected Dialog onCreateDialog(int id) { 

    AlertDialog.Builder builder = new AlertDialog.Builder(this); 

    switch(id){ 

    case DIALOG_TEST: 

     LinearLayout layout = (LinearLayout) ((LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.dialog_test, null); 

     builder.setTitle("Enter Something").setView(layout); 
     return builder.create(); 
    } 
} 
+0

संवाद को बनाने की आवश्यकता है क्योंकि यह संदेश (और इसके अन्य पहलू) प्रत्येक बार भिन्न होते हैं। –

+0

संवादों में एक findViewById विधि है। विचारों का संदर्भ प्राप्त करने के लिए आपको इसका उपयोग करना चाहिए और फिर उन्हें अपडेट करना चाहिए। – Maximus

+0

हाँ मुझे इसके बारे में पता है। मैं प्रत्येक बार सकारात्मक बटन के लिए 'ऑनक्लिक' व्यवहार को भी बदल रहा हूं। मैंने उपर्युक्त मूल पोस्ट में इसका उल्लेख नहीं किया है, इसलिए मैं उदाहरण को सरल बना सकता हूं। –

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

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