Otrzymuję ten błąd. Próbowałem wielu rozwiązań, ale nie udało mi się tego rozwiązać. Pomóż mi! Muszę dodać widok powierzchni i przycisk do działania za pomocą fragmentów.
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;
}
}
Błąd:
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
kliknięciu lub wcześniej.activity_cam
plik xmlOdpowiedzi:
Spróbuj wymienić
View v = inflater.inflate(R.layout.camera_fragment, parent);
Z
View v = inflater.inflate(R.layout.camera_fragment, parent, false);
lub
View v = inflater.inflate(R.layout.camera_fragment, null);
źródło
Na to pytanie już udzielono odpowiedzi, ale nadal chciałbym dodać powód dodania false jako trzeciego parametru.
Źródło: http://developer.android.com/guide/components/fragments.html
źródło
W moim przypadku robiłem
setTransition()
podczasFragmentTransaction
. Poniższy kod zadziałał dla mnie: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 } ... }
Prawdopodobnie dzieje się tak, gdy wielokrotnie przełączasz się między fragmentami, że widok nie ma czasu na naprawdę oderwanie się od rodzica z powodu trwającego przejścia.
źródło
MapView
a użytkownik może często nawigować między takimi fragmentami. Ponieważ całkowite odtworzenie ich widoku jest uciążliwe za każdym razem, robię buforowanie widoku (zachowuję wystąpienie widoku w Fragment i zwracam goonCreateView
). Jednak z powodu animacji przejścia między 2 takimi fragmentami oba widoki przez chwilę współistnieją i jeśli użytkownik wróci wystarczająco szybko, nastąpi awaria. Więc dzwonienieendViewTransition
jest rozwiązaniem. Wielkie dzięki i +1 zasłużenie.Używam API 26.0.2 iw moim przypadku nastąpiła awaria z powodu niestandardowych animacji ustawionych dla moich fragmentów. Skomentowanie wezwania do ustawienia niestandardowej animacji rozwiązało problem.
fragmentTransaction.setCustomAnimations (android.R.anim.fade_in, android.R.anim.fade_out);
źródło
Ja też spotkałem się z tym problemem i to jest moje rozwiązanie. to jest bardzo łatwe
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; }
Mam nadzieję, że będę dla Ciebie przydatny
źródło
Określenie
Id
elementu nadrzędnego i podrzędnego, szczególnie w przypadku widoków niestandardowych, wxml
pliku może rozwiązać problem.źródło
Tylko dla twojego odniesienia. Wygląda na to, że problem dotyczy zestawu SDK systemu Android.
Mam taką samą sytuację jak @Satheesh z wersją SDK: 27.0.2 i wydaje się, że próba usunięcia setCustomAnimation działa. Ale usunięcie setCustomAnimations wymaga wielu zmian, wolałbym zachować niestandardową animację. To, co zrobiłem, to uaktualnienie SDK do najnowszej wersji, która na razie jest 27.1.1. I to działa dla mnie.
źródło
Może być pomocne
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){ }
źródło
Miałem nawigację w swoim kodzie i ten błąd pojawił się po kliknięciu przycisku Wstecz z jednego z fragmentów. Rozwiązano to, gdy w nav_graph umieściłem popUpTo w powiązanych działaniach . Niektóre działania zostały wykonane, ale nic się nie wyświetlało.
źródło
Spróbuj tego.
((CamActivity)getActivity()).finish();
źródło