"El niño especificado ya tiene un padre" error usando FragmentStatePagerAdapater

He intentado implementar algunas de las soluciones de todas las preguntas similares, pero ninguna de ellas parece funcionar en mi situación. Mi situación es ligeramente diferente porque en lugar de obtener la vista de superficie de xml, lo estoy creando a través de una clase SurfaceView y añadiéndola a FrameLayout. Estoy haciendo esto porque quiero usar un mediaplayer cuando se crea la superficie.

Logcat

07-12 11:02:28.221: E/AndroidRuntime(7055): FATAL EXCEPTION: main 07-12 11:02:28.221: E/AndroidRuntime(7055): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.view.ViewGroup.addViewInner(ViewGroup.java:3337) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.view.ViewGroup.addView(ViewGroup.java:3208) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.view.ViewGroup.addView(ViewGroup.java:3165) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.view.ViewGroup.addView(ViewGroup.java:3145) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:915) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:461) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:163) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.support.v4.view.ViewPager.populate(ViewPager.java:1064) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.support.v4.view.ViewPager.populate(ViewPager.java:911) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1432) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.view.View.measure(View.java:12892) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:594) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:376) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.view.View.measure(View.java:12892) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.view.View.measure(View.java:12892) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.widget.LinearLayout.measureVertical(LinearLayout.java:812) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.view.View.measure(View.java:12892) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293) 07-12 11:02:28.221: E/AndroidRuntime(7055): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2268) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.view.View.measure(View.java:12892) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1159) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2545) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.os.Handler.dispatchMessage(Handler.java:99) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.os.Looper.loop(Looper.java:137) 07-12 11:02:28.221: E/AndroidRuntime(7055): at android.app.ActivityThread.main(ActivityThread.java:4507) 07-12 11:02:28.221: E/AndroidRuntime(7055): at java.lang.reflect.Method.invokeNative(Native Method) 07-12 11:02:28.221: E/AndroidRuntime(7055): at java.lang.reflect.Method.invoke(Method.java:511) 07-12 11:02:28.221: E/AndroidRuntime(7055): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790) 07-12 11:02:28.221: E/AndroidRuntime(7055): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557) 07-12 11:02:28.221: E/AndroidRuntime(7055): at dalvik.system.NativeStart.main(Native Method) 

Mi código es el siguiente:

VideoFragment.java

 public class VideoFragment extends Fragment{ private static final String TAG = "Fuck this"; static String vpath; static Context cxt; static int pos; static VideoFragment newInstance(int position, Cursor cursor, Context context) { pos = position; cursor.moveToPosition(position); vpath = cursor.getString(cursor.getColumnIndex(MediaStore.Video.Media.DATA)); cxt = context; VideoFragment f = new VideoFragment(); Bundle args = new Bundle(); args.putInt("position", position); f.setArguments(args); return f; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //mNum = getArguments() != null ? getArguments().getInt("num") : 1; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.full_image, container, false); FrameLayout preview = (FrameLayout) v.findViewById(R.id.framelayout); VidView vidview = new VidView(cxt); preview.addView(vidview, pos); return preview; } public class VidView extends SurfaceView implements SurfaceHolder.Callback { MediaPlayer player; public VidView(Context context) { super(context); // TODO Auto-generated constructor stub } @Override public void surfaceCreated(SurfaceHolder holder) { player = new MediaPlayer(); player.setDisplay(holder); try { player.setDataSource(vpath); player.prepare(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (player != null){ if ( player.isPlaying() ) player.stop(); player.reset(); player.release(); player = null; } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } } 

La Actividad y el FragmentoStatePagerAdapater

 public class FullImageActivity extends FragmentActivity { private static final String TAG = "MediaPlayer shit"; //MediaPlayer player; //SurfaceView surfaceview; SurfaceHolder surfaceHolder; Gridview gridview = new Gridview(); int width; int height; Cursor cursor; ViewPager viewpager; PagerAdapter pageradapter; String path; int position; String[] projection = { GridviewData.ROWID, GridviewData.BITMAPPATH, GridviewData.VIDEOFILEPATH}; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.image_pager); Intent i = getIntent(); position = i.getExtras().getInt("position"); path = i.getExtras().getString("videopath"); cursor = getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, gridview.mediaColumns, MediaStore.Video.Media.DATA + " like ?", new String[] {Environment.getExternalStorageDirectory().getPath() + "/Reelcam/TheReelcams/%"}, null); pageradapter = new PagerAdapter(getSupportFragmentManager()); viewpager = (ViewPager) findViewById(R.id.pager); //viewpager.setOffscreenPageLimit(1); viewpager.setAdapter(pageradapter); } @Override protected void onPause() { super.onPause(); } @Override protected void onResume() { //surfaceview.setVisibility(View.VISIBLE); super.onResume(); } @Override protected void onDestroy() { cursor.close(); super.onDestroy(); } public class PagerAdapter extends FragmentStatePagerAdapter{ public PagerAdapter(FragmentManager fm) { super(fm); // TODO Auto-generated constructor stub } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } @Override public Fragment getItem(int position) { Log.i(TAG, "in getitem"); return VideoFragment.newInstance(position, cursor, getApplicationContext()); } @Override public int getCount() { // TODO Auto-generated method stub return cursor.getCount(); } } 

3 Solutions collect form web for “"El niño especificado ya tiene un padre" error usando FragmentStatePagerAdapater”

Aquí:

 View v = inflater.inflate(R.layout.full_image, container, false); FrameLayout preview = (FrameLayout) v.findViewById(R.id.framelayout); . . . . . . return preview; 

Está inflando el diseño full_image en v . Pero usted está regresando otra vista de id frameLayout que puede tener ya un padre (probablemente v ) en el diseño. v lugar.

Asegúrese de devolver una vista que no tenga un padre. Mire en R.layout.full_image y vea que si R.id.framelayout ya está encerrado en un ViewGroup padre.

Esta es la solución:

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

¿En qué línea se encuentra su error específico? Esto suele ser causado por la adición de un niño a un padre varias veces. Por ejemplo, cuando se sigue añadiendo su vista de superficie al fragmento y se establece el contenido de la vista de superficie con algo nuevo, el fragmento sigue viendo el mismo elemento. Para evitar este problema

 surfaceview = new SurfaceView() 

establecer la vista de superficie toe nuevo contenido y agregarlo de nuevo en su fragmento.

Espero que esto ayude.

  • Cómo configurar la imagen en la vista de la imagen en android?
  • Sincronizar la posición de dos vistas ScrollView
  • Cómo restablecer completamente la vista web de Android antes de cargar la nueva solicitud
  • Android 3-level-ExpandableListView no mostrar filas sólo en el tercer nivel
  • ¿Puede explicar alguien inflar método? Mayor comprensión de las vistas de Android
  • Vista de Android WebView
  • ¿Existe un reemplazo para el widget Galería con Reciclado de vistas?
  • Cómo crear un ImageView que llena la altura de los padres y muestra una imagen lo más grande posible?
  • ¿Cómo comprobar si una viewStub ya está inflada?
  • Empuje el contenido excepto alguna vista cuando se muestra el teclado
  • Webview con inicio de sesión de Windows parpadeando en el cuadro de diálogo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.