2015-02-24 62 views
0

當切換回我已經看到的視圖時,活動崩潰並拋出IllegalStateException:指定的子項已經有父項。您必須先調用子對象的父對象的removeView()。IllegalStateException:指定的子項已經有父項

堆棧跟蹤:

02-23 23:59:22.685 9254-9254/ldellabella3.gatech.edu.sustainability_in_computer_science E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: ldellabella3.gatech.edu.sustainability_in_computer_science, PID: 9254 
    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:3770) 
      at android.view.ViewGroup.addView(ViewGroup.java:3623) 
      at android.view.ViewGroup.addView(ViewGroup.java:3568) 
      at android.view.ViewGroup.addView(ViewGroup.java:3544) 
      at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:951) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126) 
      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739) 
      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489) 
      at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:486) 
      at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1073) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:919) 
      at android.support.v4.view.ViewPager$3.run(ViewPager.java:249) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:812) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:612) 
      at android.view.Choreographer.doFrame(Choreographer.java:581) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:798) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:146) 
      at android.app.ActivityThread.main(ActivityThread.java:5487) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
      at dalvik.system.NativeStart.main(Native Method) 
02-24 00:02:57.133 9800-9800/ldellabella3.gatech.edu.sustainability_in_computer_science E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: ldellabella3.gatech.edu.sustainability_in_computer_science, PID: 9800 
    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:3770) 
      at android.view.ViewGroup.addView(ViewGroup.java:3623) 
      at android.view.ViewGroup.addView(ViewGroup.java:3568) 
      at android.view.ViewGroup.addView(ViewGroup.java:3544) 
      at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:951) 
      at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1126) 
      at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:739) 
      at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489) 
      at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:486) 
      at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:1073) 
      at android.support.v4.view.ViewPager.populate(ViewPager.java:919) 
      at android.support.v4.view.ViewPager$3.run(ViewPager.java:249) 
      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:812) 
      at android.view.Choreographer.doCallbacks(Choreographer.java:612) 
      at android.view.Choreographer.doFrame(Choreographer.java:581) 
      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:798) 
      at android.os.Handler.handleCallback(Handler.java:733) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:146) 
      at android.app.ActivityThread.main(ActivityThread.java:5487) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099) 
      at dalvik.system.NativeStart.main(Native Method) 

,我傳遞給的setContentView()的XML僅僅是

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.view.ViewPager 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/pager" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

這是一個不斷崩潰的活動:

public class LearnMoreSlidesActivity extends FragmentActivity { 

    private ViewPager viewPager; 
    private PagerAdapter pagerAdapter; 
    private ImageView[] slidesArray; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_learn_more); 

     viewPager = (ViewPager) findViewById(R.id.pager); 
     pagerAdapter = new ScreenSlidePagerAdapter(getSupportFragmentManager()); 
     viewPager.setAdapter(pagerAdapter); 

     slidesArray = new ImageView[]{ 
       new ImageView(this), 
       new ImageView(this), 
       new ImageView(this) 
     }; 

     slidesArray[0].setImageResource(R.drawable.earthzineimg); 
     slidesArray[1].setImageResource(R.drawable.computingsustainability); 
     slidesArray[2].setImageResource(R.drawable.computingandsustainability); 

    } 

    @Override 
    public void onBackPressed() { 
     if (viewPager.getCurrentItem() == 0) { 
      // If the user is currently looking at the first step, allow the system to handle the 
      // Back button. This calls finish() on this activity and pops the back stack. 
      super.onBackPressed(); 
     } else { 
      // Otherwise, select the previous step. 
      viewPager.setCurrentItem(viewPager.getCurrentItem() - 1); 
     } 
    } 

    private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { 

     public ScreenSlidePagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     //this is where we "inflate" fragment_learn_more with our ldellabella3.gatech.edu.sustainability_in_computer_science.ScreenSlideFragment 
     @Override 
     public Fragment getItem(int position) { 
      ScreenSlideFragment slideFragment = new ScreenSlideFragment(); 
      slideFragment.setMySlide(slidesArray[position]); 
      return slideFragment; 
     } 

     @Override 
     public int getCount() { 
      return 3; 
     } 
    } 
} 

我ScreenSlideFragmentClass

public class ScreenSlideFragment extends Fragment { 

    private ImageView myImg; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     return myImg; 
    } 

    public void setMySlide(ImageView img) { 
     myImg = img; 
    } 
} 
+1

你可以爲你的異常添加堆棧跟蹤(不只是異常的文本)?這通常包含有價值的信息。 – Michiyo 2015-02-24 04:09:40

+0

它已被添加! – Lucas 2015-02-24 04:39:11

+0

這是來自不同異常的堆棧跟蹤 - 您通常從未在您的「AndroidManifest.xml」中聲明活動獲取的異常。您目前遇到哪些異常? – Michiyo 2015-02-24 04:43:50

回答

2

在您的片段中添加以下代碼。

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

非常感謝!我在別處看到了這個答案,但無法弄清楚如何實現它。你救了我 :') – Lucas 2015-02-24 06:03:33

相關問題