java.lang.IllegalStateException: निर्दिष्ट बच्चे के पास पहले से ही एक माता-पिता हैं


99

मैं टुकड़ों का उपयोग कर रहा हूं, जब मैं पहली बार इसे खंडित करता हूं। लेकिन दूसरी बार मुझे यह अपवाद मिला। मुझे वह पंक्ति नहीं मिली जहाँ मुझे त्रुटि मिली?

 04-04 08:51:54.320: E/AndroidRuntime(29713): FATAL EXCEPTION: main
    04-04 08:51:54.320: E/AndroidRuntime(29713): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.view.ViewGroup.addViewInner(ViewGroup.java:3013)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.view.ViewGroup.addView(ViewGroup.java:2902)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.view.ViewGroup.addView(ViewGroup.java:2859)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.view.ViewGroup.addView(ViewGroup.java:2839)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.support.v4.app.NoSaveStateFrameLayout.wrap(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.support.v4.app.FragmentManagerImpl.moveToState(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.support.v4.app.BackStackRecord.run(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.support.v4.app.FragmentManagerImpl.execPendingActions(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.support.v4.app.FragmentManagerImpl$1.run(Unknown Source)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.os.Handler.handleCallback(Handler.java:587)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.os.Handler.dispatchMessage(Handler.java:92)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.os.Looper.loop(Looper.java:132)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at android.app.ActivityThread.main(ActivityThread.java:4126)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at java.lang.reflect.Method.invokeNative(Native Method)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at java.lang.reflect.Method.invoke(Method.java:491)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:844)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:602)
    04-04 08:51:54.320: E/AndroidRuntime(29713):    at dalvik.system.NativeStart.main(Native Method)

जब मैं अपनी सूची के टुकड़े के एक तत्व पर क्लिक करता हूं तो यहां मैं क्या कर रहा हूं।

// If we are not currently showing a fragment for the new
 // position, we need to create and install a new one.
 RouteSearchFragment df = RouteSearchFragment.newInstance(index);

 // Execute a transaction, replacing any existing fragment
 // with this one inside the frame.
 FragmentTransaction ft = fragmentManager.beginTransaction();
 ft.replace(R.id.details_full, df);
 ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
 ft.commit();

पहली बार ठीक है, मैं सूची से तत्व 2 क्लिक करता हूं, यह भी ठीक है; लेकिन जब मैं एलिमेंट 1 पर लौटता हूं तो मुझे यह बग मिला है।

सबको धन्यवाद!


कॉल करने के लिए ज़रूरत है layoutView.removeAllViews (); लेआउट में विचार जोड़ने से पहले
σѕяρρ viewsя K

@imrankhan गलत! आप सभी को हटाए बिना जोड़ सकते हैं। सबसे महत्वपूर्ण हिस्सा गायब है और स्टैकट्रेस में कोई कस्टम पैकेज नहीं है, मेरा सुझाव है कि आप कुछ कोड निकालें और इसे चरण दर चरण परीक्षण करें ...
WarrenFaith

1
मैं और अधिक विवरण जोड़ सकता हूं, कृपया आप यह देख सकते हैं?
हैथेम स्मिस्सी

यह रूटसर्च फ़्रेग्मेंट क्लास क्या है ?? Android डॉक्स में कोई संदर्भ नहीं मिल सकता है। कृपया वर्ग परिभाषा को भी अपडेट करें।
नोब

जवाबों:


36

जब आप OnCreateViewअपनी RouteSearchFragmentकक्षा में ओवरराइड करते हैं, तो क्या आपके पास है

if(view != null) {
    return view; 
}

कोड खंड?

यदि हां, तो रिटर्न स्टेटमेंट को हटाकर अपनी समस्या का समाधान करना चाहिए।

आप कोड रख सकते हैं और यदि आप दृश्य डेटा को पुन: उत्पन्न नहीं करना चाहते हैं, तो दृश्य वापस कर सकते हैं, और onDestroyView () विधि जिसे आप इस दृश्य को उसके माता-पिता से इस तरह हटाते हैं:

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (view != null) {
            ViewGroup parent = (ViewGroup) view.getParent();
            if (parent != null) {
                parent.removeAllViews();
            }
        }
    }

5
@Override सार्वजनिक शून्य onDestroyView () {super.onDestroyView (); ViewGroup parentViewGroup = (ViewGroup) mRoutesSearchViewContainer.getParent (); if (null! = parentViewGroup) {parentViewGroup.removeView (mRoutesSearchViewContainer); }}
३37 पर हायथेम सौसी

@ मेदो: क्या आप इसके लिए संक्षिप्त विवरण दे सकते हैं। मुझे लॉगकोट में वही त्रुटि दिखाई गई है। जैसा कि आपने सुझाव दिया है "रिटर्न स्टेटमेंट को हटा दें अपनी समस्या को हल करना चाहिए" लेकिन हमें ऑनक्रीट व्यू () विधि में ऑब्जेक्ट को वापस करने की आवश्यकता है। क्या आप स्पष्टीकरण के लिए स्निपेट कोड प्रदान कर सकते हैं। धन्यवाद।
कृष्णा प्रसाद

@ कृष्ण बस सामान्य रूप से दृश्य को बढ़ाएँ और लौटाएँ। यदि आप कथन को पूरा छोड़ सकते हैं।
मेडो

65
मेरे लिए, मैं सिर्फ बदलने के लिए किया था return inflater.inflate(R.layout.fragment_search, container);के साथreturn inflater.inflate(R.layout.fragment_search, container, false);
Sufian

370

एक पुराने प्रश्न पर पोस्ट करने के लिए क्षमा करें, लेकिन मैं पूरी तरह से अलग समाधान का उपयोग करके इसे ठीक करने में सक्षम था। मुझे यह अपवाद मिल रहा था, लेकिन मैंने अपने onCreatView ओवरराइड की पहली पंक्ति को इसमें से बदल दिया:

View result = inflater.inflate(R.layout.customer_layout, container);

...इसके लिए:

View result = inflater.inflate(R.layout.customer_layout, container, false);

मुझे पता नहीं क्यों लेकिन ओवरराइड का उपयोग करना जो बूलियन को स्वीकार करता है क्योंकि तीसरे परम ने इसे तय किया। मुझे लगता है कि यह फ्रैगमेंट और / या गतिविधि को "कंटेनर" का उपयोग नव-निर्मित व्यू के माता-पिता के रूप में नहीं करने के लिए कहता है।


53
क्षमा न करें - यह मेरे लिए बहुत उपयोगी था, और स्पष्ट रूप से अन्य लोगों की संख्या। धन्यवाद!
कोड्स में हेड

बहुत बहुत धन्यवाद, मैं इसे भूल जाता हूं और इस जवाब पर वापस आ रहा हूं
नोलोमन

@ पैट्रिक, पहले कंटेनर को फुलाया हुआ दृश्य देता है, झूठे झंडे को जोड़कर निर्दिष्ट करता है कि आप कंटेनर में फुलाए गए दृश्य को जोड़ना नहीं चाहते हैं।
नेउ

और मैं इस पोस्ट पर वापस आता रहता हूं और यह पता
लगाता हूं

45

मुझे कई बार इस मुद्दे का सामना करना पड़ा है। कृपया इस समस्या को हल करने के लिए निम्नलिखित कोड जोड़ें:

@Override
    public void onDestroyView() {
        super.onDestroyView();
        if (view != null) {
            ViewGroup parentViewGroup = (ViewGroup) view.getParent();
            if (parentViewGroup != null) {
                parentViewGroup.removeAllViews();
            }
        }
    }

धन्यवाद


इस समाधान पर धन्यवाद :) मेरे पास एक बहुत विशिष्ट मामला है जहां मैं इसे हल करने के लिए इनफ्लोटर का उपयोग नहीं कर सकता हूं। आपने मुझे बहुत समय बचाया
Bojan

मुझे क्षमा करें, मुझे समझ में नहीं आ रहा है कि मैं android के लिए नया हूं।
जिन विन हेटेट

View.getParent () में; खुराक दृश्य वस्तु कहाँ से आती है?
जिन विन हेटेट

क्रिस्टी YG: वैश्विक चर के रूप में एक दृश्य उदाहरण लें, और वैश्विक चर के ऊपर अपने लेआउट xml को फुलाएँ। तुम मेरा पीछा कर रहे हो या नहीं?
हार्दिक

हां, उदाहरण के तौर पर वैश्विक घोषित करें।
हार्दिक

35

अगर आपका यह कथन है ।।

View view = inflater.inflate(R.layout.fragment1, container);//may be Incorrect 

फिर यह प्रयास करें .. तीसरे तर्क के रूप में गलत जोड़ें .. हो सकता है कि यह मदद कर सकता है ।।

View view = inflater.inflate(R.layout.fragment1, container, false);//correct one

21

मेरे पास एक खंड में यह कोड था और अगर मैं इस टुकड़े में वापस आने की कोशिश कर रहा था तो यह दुर्घटनाग्रस्त हो गया

if (mRootView == null) {
    mRootView = inflater.inflate(R.layout.fragment_main, container, false);
} 

इस सूत्र पर उत्तर एकत्र करने के बाद, मुझे एहसास हुआ कि mRootView के माता-पिता के पास अभी भी mRootView बच्चे के रूप में है। तो, यह मेरा फिक्स था।

if (mRootView == null) {
    mRootView = inflater.inflate(R.layout.fragment_main, container, false);
} else {
    ((ViewGroup) mRootView.getParent()).removeView(mRootView);
}

उम्मीद है की यह मदद करेगा


2
+1 ने मेरी मदद की। विशेष रूप से सच है अगर आपकी गतिविधि बनी हुई है लेकिन टुकड़ा प्रबंधक शीर्ष पर नए टुकड़े जोड़ रहा है। जब यह पहले टुकड़े में वापस आ जाता है, तो यह सुनिश्चित करने की आवश्यकता होती है कि पुराने रूट दृश्य को हटा दिया जाए। धन्यवाद!
बुन्देईटेड्डी

इसने मेरी बहुत मदद की। मैं उस समाधान को 3 दिनों से ढूंढ रहा हूं। सरल और सुंदर जवाब।
जिन विन हेटेट

वाह! अंत में यह मेरे लिए काम किया! grat घोल। धन्यवाद!
एविस्पर

मेरे पास एक तर्क नहीं है कि "क्यों (ViewGroup) mRootView.getParent ())। RemoveView (mRootView);" सीधे "कॉलिंग के विपरीत काम करता है" <जोIsParentViewGroupName> .removeView (mRootView) "लेकिन यह मेरे लिए भी काम करता है, मैं एंड्रॉइड 8.0 और 9.0 पर परीक्षण कर रहा हूं। धन्यवाद कली ^
ख् 0

16

यह तब भी होता है जब दृश्य onCreateView () द्वारा लौटाया गया दृश्य नहीं है।

उदाहरण:

View rootView = inflater.inflate(R.layout.my_fragment, container, false);

TextView textView = (TextView) rootView.findViewById(R.id.text_view);
textView.setText("Some text.");

return textView;

ठीक कर:

return rootView;

के बजाय:

return textView; // or whatever you returned

धन्यवाद! इसने मेरी मदद की!
सुधेश मोहन

5

मुझे यह समस्या थी और मैं इसे जावा कोड में हल नहीं कर पाया। समस्या मेरे xml के साथ थी।

मैं एक कंटेनर में एक textView जोड़ने की कोशिश कर रहा था, लेकिन एक LinearLayout के अंदर textView को लपेट दिया था।

यह मूल xml फ़ाइल थी:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceListItemSmall"
        android:gravity="center_vertical"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:textColor="#fff"
        android:background="?android:attr/activatedBackgroundIndicator"
        android:minHeight="?android:attr/listPreferredItemHeightSmall"/>

</LinearLayout>

अब LinearLayout को हटा दिया गया है:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@android:id/text1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceListItemSmall"
        android:gravity="center_vertical"
        android:paddingLeft="16dp"
        android:paddingRight="16dp"
        android:textColor="#fff"
        android:background="?android:attr/activatedBackgroundIndicator"
        android:minHeight="?android:attr/listPreferredItemHeightSmall"/>

यह मुझे बहुत पसंद नहीं आया, लेकिन इसने यह चाल चली, और मैंने अपना जावा कोड बिल्कुल नहीं बदला। यह सब xml में था।


2

आप एक Viewमें जोड़ रहे हैं layout, लेकिन दृश्य पहले से ही दूसरे में है layout। एक दृश्य एक से अधिक स्थानों पर नहीं हो सकता।


मैंने अपने प्रश्न में और विवरण जोड़े, क्या आप इसे देख सकते हैं?
हैथेम स्मिसि

1

यह समाधान मदद कर सकता है:

public class FragmentItem extends Android.Support.V4.App.Fragment
{
    View rootView;
    TextView textView;

    public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        if (rootView != null) 
        {
            ViewGroup parent = (ViewGroup)rootView.Parent;
            parent.RemoveView(rootView);
        } else {
            rootView = inflater.Inflate(Resource.Layout.FragmentItem, container, false);
            textView = rootView.FindViewById<TextView>(Resource.Id.textViewDisplay);            
        }
        return rootView;
    }
}

1
मुझे लगता है कि rootView हमेशा शून्य रहेगा क्योंकि आपने इसे प्रारंभ नहीं किया था।
ज़िन विन हेटेट

rootView हमेशा अशक्त
रहें

1

मैं निर्धारित करके इसे हल attachToRootके inflater.inflate()लिए false

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_overview, container, false);
    return view;
}

0

अपनी xml फ़ाइल में आप को_प्रतिस्पर्धी से लेकर match_parent के लेआउट_आवेदन और लेआउट_हाइट सेट करना चाहिए। यह मेरे लिए तय है।

<FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.