Ich erhalte diesen Fehler. Ich habe viele Lösungen ausprobiert, aber ich konnte das nicht lösen. Hilf mir! Ich muss die Oberflächenansicht und die Schaltfläche mithilfe von Fragmenten zur Aktivität hinzufügen.
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
capturePic
Klicken oder davor.activity_cam
Antworten:
Versuchen Sie zu ersetzen
View v = inflater.inflate(R.layout.camera_fragment, parent);
Mit
View v = inflater.inflate(R.layout.camera_fragment, parent, false);
oder
View v = inflater.inflate(R.layout.camera_fragment, null);
quelle
Diese Frage wurde bereits beantwortet, aber ich möchte dennoch den Grund für das Hinzufügen von false als dritten Parameter hinzufügen .
Quelle: http://developer.android.com/guide/components/fragments.html
quelle
In meinem Fall habe ich das
setTransition()
während der gemachtFragmentTransaction
. Der folgende Code hat bei mir funktioniert:override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { if(this::rootView.isInitialized){ if(rootView.getParent() != null){ (rootView.getParent() as ViewGroup).endViewTransition(rootView) } return this.rootView } ... }
Dies passiert wahrscheinlich, wenn Sie wiederholt zwischen Fragmenten wechseln und die Ansicht aufgrund des laufenden Übergangs keine Zeit bekommt, sich wirklich vom übergeordneten Element zu lösen.
quelle
MapView
und der Benutzer kann häufig zwischen solchen Fragmenten navigieren. Da das vollständige Neuerstellen ihrer Ansicht jedes Mal umständlich ist, führe ich das Zwischenspeichern von Ansichten durch (Beibehalten der Instanz der Ansicht in Fragment und Zurückgeben inonCreateView
). Aufgrund von Übergangsanimationen zwischen zwei solchen Fragmenten existieren beide Ansichten kurz nebeneinander, und wenn der Benutzer schnell genug zurück navigiert, stürzt sie ab. AnrufenendViewTransition
ist also die Lösung. Vielen Dank und +1 verdient.Ich verwende API 26.0.2 und in meinem Fall ereignete sich der Absturz aufgrund von benutzerdefinierten Animationen, die für meine Fragmente festgelegt wurden. Das Problem wurde behoben, indem der Aufruf zum Festlegen der benutzerdefinierten Animation auskommentiert wurde.
fragmentTransaction.setCustomAnimations (android.R.anim.fade_in, android.R.anim.fade_out);
quelle
Ich bin auch auf dieses Problem gestoßen, und das ist meine Lösung. es ist sehr leicht
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; }
Ich hoffe, Ihnen nützlich zu sein
quelle
Die Angabe
Id
für das übergeordnete und das untergeordnete Element, insbesondere für benutzerdefinierte Ansichten, in derxml
Datei kann das Problem lösen.quelle
Nur dass du weist. Es scheint ein Problem im Android SDK zu sein.
Ich habe die gleiche Situation wie @Satheesh mit der SDK-Version: 27.0.2 und der Versuch, setCustomAnimation zu entfernen, scheint zu funktionieren. Um die setCustomAnimations zu entfernen, müssen jedoch viele Änderungen vorgenommen werden. Ich würde es vorziehen, die benutzerdefinierte Animation beizubehalten. Ich habe das SDK auf die neueste Version 27.1.1 aktualisiert. Und es funktioniert bei mir.
quelle
Könnte hilfreich sein
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){ }
quelle
Ich hatte Navigation in meinem Code und dieser Fehler wurde angezeigt, als ich auf die Schaltfläche "Zurück" eines der Fragmente klickte. Es wurde gelöst, als ich in nav_graph popUpTo in verwandte Aktionen s setzte. Einige Aktionen wurden ausgeführt, aber es wurde nichts angezeigt.
quelle
Versuche dies.
((CamActivity)getActivity()).finish();
quelle