android — java.lang.IllegalStateException: указанный дочерний элемент уже имеет родителя" />

java.lang.IllegalStateException: указанный дочерний элемент уже имеет родителя

Я использую фрагменты, когда в первый раз создаю экземпляр фрагмента. но во второй раз я получил это исключение. Я не смог найти строку, где я получил ошибку?

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

В первый раз все в порядке, я нажимаю element2 из списка, это тоже нормально; но когда я возвращаюсь к element1, я получаю эту ошибку.

Спасибо всем!

88 голосов | спросил haythem souissi 4 PMpWed, 04 Apr 2012 12:00:30 +040000Wednesday 2012, 12:00:30

10 ответов


0

Когда вы переопределяете OnCreateView в своем RouteSearchFragment класс, у вас есть

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

сегмент кода?

Если это так, удаление оператора return должно решить вашу проблему.

Вы можете сохранить код и вернуть представление, если вы не хотите восстанавливать данные представления, а методом onDestroyView () вы удалите это представление из его родителя следующим образом:

    @Override
    public void onDestroyView() {
        super.onDestroyView();
        if (view != null) {
            ViewGroup parent = (ViewGroup) view.getParent();
            if (parent != null) {
                parent.removeAllViews();
            }
        }
    }
ответил Medo 4 PMpWed, 04 Apr 2012 16:09:36 +040009Wednesday 2012, 16:09:36
0

Извините, что пост к старому вопросу, но я смог исправить это, используя совершенно другое решение. Я получаю это исключение, но я изменил первую строку моего переопределения onCreatView из этого:

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

... на это:

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

Я понятия не имею, почему, но с помощью переопределения, которое принимает логическое значение в качестве третьего, исправило его. Я думаю, что это говорит Фрагменту и /или Деятельности не использовать «контейнер» в качестве родителя вновь созданного View. НТН!

ответил Patrick 19 +04002012-10-19T04:47:40+04:00312012bEurope/MoscowFri, 19 Oct 2012 04:47:40 +0400 2012, 04:47:40
0

Если у вас есть это утверждение ..

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

Тогда попробуйте это. Добавьте false в качестве третьего аргумента. Может быть, это поможет.

View view = inflater.inflate(R.layout.fragment1, container, false);//correct one
ответил Dhananjay M 18 J000000Friday14 2014, 11:52:00
0

У меня был этот код во фрагменте, и он зависал, если я пытался вернуться к этому фрагменту

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

надеюсь, это поможет

ответил user1736525 4 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 04 Sep 2013 15:29:51 +0400 2013, 15:29:51
0

Это также происходит, когда представление, возвращаемое методом 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;

Fix:

return rootView;

Вместо:

return textView; // or whatever you returned
ответил Mateus Pires 19 FriEurope/Moscow2014-12-19T23:37:24+03:00Europe/Moscow12bEurope/MoscowFri, 19 Dec 2014 23:37:24 +0300 2014, 23:37:24
0

У меня была эта проблема, и я не мог решить ее в коде Java. Проблема была с моим xml.

Я пытался добавить textView в контейнер, но обернул textView внутри LinearLayout.

Это был оригинальный 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"/>

Мне это не показалось особенным, но это помогло, и я вообще не изменил свой Java-код. Это было все в XML.

ответил DroidCrafter 13 +03002015-10-13T17:00:38+03:00312015bEurope/MoscowTue, 13 Oct 2015 17:00:38 +0300 2015, 17:00:38
0

Вы добавляете View в layout, но представление уже находится в другом layout. Вид не может быть в нескольких местах.

ответил noob 4 PMpWed, 04 Apr 2012 12:21:17 +040021Wednesday 2012, 12:21:17
0

Это решение может помочь:

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;
    }
}
ответил Bhavit S. Sengar 18 J0000006Europe/Moscow 2014, 10:32:11
0

в своем XML-файле вы должны установить layout_width и layout_height от wrap_content до match_parent. это исправлено для меня.

<FrameLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
ответил Evan Ngo 15 J000000Sunday18 2018, 10:38:32
0

Я решил это, установив attachToRoot из inflater.inflate() to false.

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_overview, container, false);
    return view;
}
ответил Mr. B. 26 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 26 Sep 2018 13:45:59 +0300 2018, 13:45:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132