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 এ ফিরে আসি তখন আমি এই বাগটি পেয়েছি।

ধন্যবাদ সবাইকে!


লেআউটভিউ.রেমভএলভিউস () কল করতে হবে; বিন্যাসে ভিউগুলি যুক্ত করার আগে
0 কে

@ মিমরখান ভুল! আপনি সমস্ত অপসারণ ছাড়াই যোগ করতে পারেন। সর্বাধিক গুরুত্বপূর্ণ অংশটি অনুপস্থিত এবং
স্ট্যাকট্রেসে

4
আমি আরও বিশদ যুক্ত করছি, আপনি কি এটি দেখতে পারেন?
হাইথেম স্যুইসি

এই রুটস সার্চফ্রেগমেন্ট ক্লাসটি কী ?? অ্যান্ড্রয়েড ডক্সে কোনও রেফারেন্স খুঁজে পাচ্ছেন না। ক্লাস সংজ্ঞাটিও আপডেট করুন।
নূব

উত্তর:


36

আপনি যখন OnCreateViewআপনার RouteSearchFragmentক্লাসে ওভাররাইড করবেন তখন আপনার কি আছে

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

কোড সেগমেন্ট?

যদি তা হয়, রিটার্নের বিবৃতি অপসারণ করা আপনার সমস্যার সমাধান করা উচিত।

আপনি কোডটি ধরে রাখতে এবং ভিউটি ফিরে আসতে পারেন যদি আপনি দর্শন ডেটা পুনরায় তৈরি করতে না চান এবং অন ডেট্রোয়াই ভিউ () পদ্ধতিটি আপনি এই মতটিকে তার পিতামাতার কাছ থেকে এইভাবে সরিয়ে দেন:

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

5
@ ওভাররাইড পাবলিক শূন্য অনডেট্রয়েভিউ () {সুপার.অনডেস্ট্রয়ভিউ (); ভিউগ্রুপ প্যারেন্টভিউগ্রুপ = (ভিউগ্রুপ) এমরউটস সার্চভিউকন্টেন্টার.সেটপ্যারেন্ট (); যদি (নাল! = প্যারেন্টভিউগ্রুপ) {প্যারেন্টভিউগ্রুপ.রেমভভিউ (এমআরউটস সার্চভিউ কনটেনার); }}
হায়থেম স্যুইসি

@ মেদো: আপনি কি এর জন্য সংক্ষিপ্ত ব্যাখ্যা দিতে পারেন? আমার একই ত্রুটিটি লগকটে দেখানো হয়েছে। আপনি যেমন পরামর্শটি দিয়েছেন "রিটার্নের বিবৃতিটি মুছে ফেলা উচিত আপনার সমস্যার সমাধান করা উচিত" তবে আমাদের অনক্রিটভিউ () পদ্ধতিতে ভিউ অবজেক্টটি ফিরিয়ে দিতে হবে। আপনার ব্যাখ্যা দেওয়ার জন্য আপনি স্নিপেট কোড সরবরাহ করতে পারেন? ধন্যবাদ.
কৃষ্ণ প্রসাদ

@ কৃষ্ণকে কেবল উত্সাহিত করুন এবং আপনার মতামতটি সাধারণত ফিরে আসুন। বিবৃতিটি পুরোটা এড়িয়ে যেতে পারেন।
মেডো

65
আমার জন্য, আমি শুধু প্রতিস্থাপন ছিল return inflater.inflate(R.layout.fragment_search, container);সঙ্গেreturn inflater.inflate(R.layout.fragment_search, container, false);
সুফিয়ান

370

একটি পুরানো প্রশ্ন পোস্ট করার জন্য দুঃখিত কিন্তু আমি একেবারে ভিন্ন সমাধান ব্যবহার করে এটি ঠিক করতে সক্ষম হয়েছি। আমি এই ব্যতিক্রম পাচ্ছিলাম তবে আমি এ থেকে আমার ক্রিয়েটভিউ ওভাররাইডের প্রথম লাইনটি পরিবর্তন করেছি:

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

... এটি:

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

তৃতীয় প্যারাম ঠিক করার সাথে সাথে বুলেটিয়ানটিকে গ্রহণ করে এমন ওভাররাইড ব্যবহার করার পরেও আমার কোনও ধারণা নেই। আমি মনে করি এটি ফ্র্যাগমেন্ট এবং / বা ক্রিয়াকলাপকে নতুন সৃজিত দৃশ্যের পিতামাতা হিসাবে "ধারক" ব্যবহার না করার জন্য বলে।


53
দুঃখিত হবেন না - এটি আমার পক্ষে খুব কার্যকর ছিল এবং স্পষ্টতই অন্যান্য বেশিরভাগ লোক ছিল। ধন্যবাদ!
শিরোনাম

অনেক ধন্যবাদ, আমি এটিকে ভুলে গিয়ে এই উত্তরে ফিরে আসছি
নোলোমান

@ পেট্রিক, প্রথমটি পাত্রে স্ফীত দর্শন সংযুক্ত করে, মিথ্যা পতাকা যুক্ত করে আপনি পাত্রে স্ফীত দর্শনটি যুক্ত করতে চান না তা নির্দিষ্ট করে।
Ne0

এবং আমি এই পোস্টে ফিরে আসছি এবং এটি উত্তর
পেয়ে যাচ্ছি

45

আমি অনেক সময় এই সমস্যার মুখোমুখি হয়েছি। এই সমস্যার সমাধানের জন্য দয়া করে নিম্নলিখিত কোড যুক্ত করুন:

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

ধন্যবাদ


এই সমাধানটির জন্য আপনাকে ধন্যবাদ :) আমার একটি খুব সুনির্দিষ্ট কেস রয়েছে যেখানে আমি এটি সমাধান করতে ইনফ্লেটার ব্যবহার করতে পারি না। আপনি আমাকে প্রচুর সময় সাশ্রয় করেছেন
বোজন

আমি দুঃখিত, আমি অ্যান্ড্রয়েডে নতুন c
জিন উইন হেইট

ভিউ.জেট প্যারেন্টে (); ডোজ ভিউ অবজেক্টটি কোথা থেকে এসেছে?
জিন উইন হেইট

ক্রিস্টি ওয়াইজি: গ্লোবাল ভেরিয়েবল হিসাবে একটি ভিউ উদাহরণটি ধরুন এবং উপরের গ্লোবাল ভেরিয়েবলের উপর আপনার লেআউট এক্সএমএল স্ফীত করুন। আপনি আমাকে অনুসরণ করছেন বা না?
হার্ডিক

হ্যাঁ, দৃষ্টান্তটি বিশ্বব্যাপী ঘোষণা করুন।
হার্দিক

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);
} 

এই থ্রেডে উত্তর সংগ্রহ করার পরে, আমি বুঝতে পারি যে এমরুটভিউর পিতামাতার এখনও ছোটবেলায় এমআরউটভিউ রয়েছে। সুতরাং, এটি আমার ফিক্স ছিল।

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

আশাকরি এটা সাহায্য করবে


4
+1 আমাকে সহায়তা করেছে। বিশেষত সত্য যদি আপনার ক্রিয়াকলাপটি স্থিত থাকে তবে খণ্ড ব্যবস্থাপক শীর্ষে নতুন টুকরা যোগ করছেন। এটি যখন প্রথম খণ্ডে ফিরে আসে তখন পুরানো রুট ভিউটি সরানো হয় তা নিশ্চিত করা দরকার। ধন্যবাদ!
বুন্দিদেটেডি

এটা আমাকে অনেক সাহায্য করেছে। আমি 3 দিন ধরে সেই সমাধানটি সন্ধান করছি। সহজ এবং সুন্দর উত্তর।
জিন উইন হেট

কি দারুন! অবশেষে এটি আমার পক্ষে কাজ করেছিল! ধন্যবাদ ধন্যবাদ। ধন্যবাদ!
এভিস্পার

"(ভিউগ্রুপ) এমরুটভিউ.সেটপ্যারেন্ট ()) আমার কাছে যৌক্তিক যুক্তি নেই remove" অপসারণ ভিউ (এমরুটভিউ); " সরাসরি "<WWWIISParentViewGroupName>। রেমোভ ভিউ (এমআরটভিউ)" কল করার বিপরীতে কাজ করে তবে এটি আমার পক্ষেও কাজ করে, আমি অ্যান্ড্রয়েড 8.0 এবং 9.0 এ পরীক্ষা করছি। ধন্যবাদ কুঁড়ি ^
খায়

16

এটি অনাক্রেটভিউ () দ্বারা ফিরিয়ে দেওয়া ভিউটি ফুলে উঠেছে এমন দৃশ্য নয় It

উদাহরণ:

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 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>

এখন লিনিয়ারালাউট সরানো সহ:

<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"/>

এটি আমার কাছে তেমনটা মনে হয়নি তবে এটি কৌশলটি করেছে এবং আমি আমার জাভা কোডটি মোটেও পরিবর্তন করি নি। এটি সমস্ত এক্সএমএলে ছিল।


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;
    }
}

4
আমি মনে করি রুটভিউ সর্বদা নাল থাকবে কারণ আপনি এটি আরম্ভ করেননি।
জিন উইন হেট

রুটভিউ সর্বদা নাল
থিনস্কি

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

আপনার এক্সএমএল ফাইলে আপনার লেআউট_উইথ এবং লেআউট_উইটটি মোড়ানো_পরিচয় থেকে ম্যাচ_প্যারেন্টে সেট করা উচিত। এটা আমার জন্য স্থির

<FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.