Je reçois cette erreur. J'ai essayé beaucoup de solutions mais je ne pouvais pas résoudre ceci. Aidez moi! J'ai besoin d'ajouter la vue de surface et le bouton à l'activité à l'aide de fragments.
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;
}
}
Erreur:
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
Essayez de remplacer
View v = inflater.inflate(R.layout.camera_fragment, parent);
Avec
View v = inflater.inflate(R.layout.camera_fragment, parent, false);
ou
View v = inflater.inflate(R.layout.camera_fragment, null);
On a déjà répondu à cette question, mais j'aimerais quand même ajouter la raison de l'ajout de false comme troisième paramètre.
La méthode inflate () prend trois arguments:
- L'ID de ressource de la présentation que vous souhaitez gonfler.
- Le ViewGroup doit être le parent de la disposition gonflée. Le passage du conteneur est important pour que le système applique les paramètres de présentation à la vue racine de la présentation gonflée, spécifiée par la vue parente dans laquelle il est inséré.
- Un booléen indiquant si la présentation gonflée doit être attachée au ViewGroup (le deuxième paramètre) pendant l'inflation. (Dans ce cas, la valeur est false car le système insère déjà la présentation gonflée dans le conteneur. Si vous transmettez true, vous créez un groupe de vues redondant dans la présentation finale.)
Source: http://developer.Android.com/guide/components/fragments.html
J'utilise l'API 26.0.2 et dans mon cas, le crash était dû à des animations personnalisées définies pour mes fragments. Commenter l'appel pour définir l'animation personnalisée, corrige le problème.
fragmentTransaction.setCustomAnimations (Android.R.anim.fade_in, Android.R.anim.fade_out);
Spécifiez Id
pour les éléments parent et enfant, en particulier pour les vues personnalisées, dans le fichier xml
peut résoudre le problème.
Juste pour ta culture. Cela semble être un problème dans le SDK Android.
J'ai la même situation que @Satheesh avec la version du SDK: 27.0.2 et essayer de supprimer le setCustomAnimation semble fonctionner Mais pour supprimer setCustomAnimations, il me faut beaucoup de changements, je préférerais conserver l'animation personnalisée. Ce que j'ai fait est de mettre à niveau le SDK vers la dernière version qui est 27.1.1 pour le moment. Et cela fonctionne pour moi.
Pourrait être utile
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){
}
J'ai également rencontré ce problème, et c'est ma solution. c'est très facile
View v;
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if (v == null) {
v = inflater.inflate(R.layout.camera_fragment, container);
} else {
ViewGroup parent = (ViewGroup) v.getParent();
if (parent != null) {
parent.removeView(v);
}
}
return v;
}
J'espère vous être utile