tutorial studio open makeroid example developer android android-fragments surfaceview

android - studio - Fragmentos: el hijo especificado ya tiene un padre. Debe llamar primero a removeView() en el padre del niƱo



makeroid surface view (7)

Especifique Id para elementos primarios y secundarios, especialmente para vistas personalizadas, en el archivo xml puede resolver el problema.

Estoy recibiendo este error. Intenté muchas soluciones pero no pude resolver esto. ¡Ayuadame! Necesito agregar la vista de superficie y el botón a la actividad usando fragmentos.

CamActivity.java:

public class CamActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_cam); FragmentManager fm = getSupportFragmentManager(); Fragment fragment = fm.findFragmentById(R.id.fragmentContainer); if(fragment == null) { fragment = new CamFragment(); fm.beginTransaction() .add(R.id.fragmentContainer, fragment) .commit(); } } }

CamFragment.java:

public class CamFragment extends Fragment { private static final String TAG = "CamFragment"; private Camera mCamera; private SurfaceView mSurfaceView; @Override public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState){ View v = inflater.inflate(R.layout.camera_fragment, parent); Button capturePic = (Button)v.findViewById(R.id.img_capture); capturePic.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { getActivity().finish(); } }); mSurfaceView = (SurfaceView)v.findViewById(R.id.surfaceView1); return v; } }

Error:

04-18 13:24:12.735: E/AndroidRuntime(6321): FATAL EXCEPTION: main 04-18 13:24:12.735: E/AndroidRuntime(6321): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.pack.camdictionary/com.pack.camdictionary.CamActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child''s parent first. 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1728) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1747) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.app.ActivityThread.access$1500(ActivityThread.java:155) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:993) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.os.Handler.dispatchMessage(Handler.java:130) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.os.Looper.loop(SourceFile:351) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.app.ActivityThread.main(ActivityThread.java:3814) 04-18 13:24:12.735: E/AndroidRuntime(6321): at java.lang.reflect.Method.invokeNative(Native Method) 04-18 13:24:12.735: E/AndroidRuntime(6321): at java.lang.reflect.Method.invoke(Method.java:538) 04-18 13:24:12.735: E/AndroidRuntime(6321): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 04-18 13:24:12.735: E/AndroidRuntime(6321): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:659) 04-18 13:24:12.735: E/AndroidRuntime(6321): at dalvik.system.NativeStart.main(Native Method) 04-18 13:24:12.735: E/AndroidRuntime(6321): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child''s parent first. 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.view.ViewGroup.addViewInner(ViewGroup.java:2007) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.view.ViewGroup.addView(ViewGroup.java:1902) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.view.ViewGroup.addView(ViewGroup.java:1859) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.view.ViewGroup.addView(ViewGroup.java:1839) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.support.v4.app.NoSaveStateFrameLayout.wrap(NoSaveStateFrameLayout.java:40) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:931) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1467) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:570) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1166) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.app.Activity.performStart(Activity.java:3837) 04-18 13:24:12.735: E/AndroidRuntime(6321): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1701) 04-18 13:24:12.735: E/AndroidRuntime(6321): ... 11 more


Esta pregunta ya ha sido respondida, pero aún así me gustaría agregar la razón para agregar falso como el tercer parámetro.

El método inflate () toma tres argumentos:

  • El ID de recurso del diseño que desea inflar.
  • ViewGroup para ser el padre del diseño inflado. Pasar el contenedor es importante para que el sistema aplique parámetros de diseño a la vista raíz del diseño inflado, especificado por la vista principal en la que va.
  • Un booleano que indica si el diseño inflado debe unirse al ViewGroup (el segundo parámetro) durante el inflado. (En este caso, esto es falso porque el sistema ya está insertando el diseño inflado en el contenedor; pasar verdadero crearía un grupo de vista redundante en el diseño final).

Fuente: http://developer.android.com/guide/components/fragments.html


Estoy usando API 26.0.2 y en mi caso, el bloqueo estaba ocurriendo debido a las animaciones personalizadas establecidas para mis fragmentos. Al comentar la llamada para establecer la animación personalizada, se corrigió el problema.

fragmentTransaction.setCustomAnimations (android.R.anim.fade_in, android.R.anim.fade_out);


Intenta reemplazar

View v = inflater.inflate(R.layout.camera_fragment, parent);

Con

View v = inflater.inflate(R.layout.camera_fragment, parent, false);

o

View v = inflater.inflate(R.layout.camera_fragment, null);


Puede ser útil

View customView1; inflater= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); customView1= inflater.inflate(R.layout.edit_custom_alert_window, null); try { if(customView2.getParent()!=null) ((ViewGroup)customView2.getParent()).removeView(customView2); }catch (Exception e){ }


Solo por tu referencia. Parece ser un problema en el Android SDK.

Tengo la misma situación que tenía @Satheesh con la versión SDK: 27.0.2 y tratando de eliminar el setCustomAnimation parece funcionar. Pero para eliminar el setCustomAnimations es necesario hacer muchos cambios, prefiero mantener la animación personalizada. Lo que he hecho es actualizar el SDK a la última versión que es 27.1.1 por ahora. Y funciona para mi.


prueba esto.

((CamActivity)getActivity()).finish();