open full from example custom activity android android-dialogfragment android-8.0-oreo

android - full - dialogfragment kotlin



¿Por qué falla Android O con "no pertenece a este FragmentManager!" (5)

He migrado mi aplicación a Android O en Android Studio 3

Al ejecutarse en un emulador de Android O, todos mis diálogosFragmentos ahora fallan con: -

java.lang.IllegalStateException: Fragment MyDialogFragment{43ccf50 #2 MyDialogFragment} declared target fragment SettingsFragment{ceed549 #0 id=0x7f0f0142 android:switcher:2131689794:0} that does not belong to this FragmentManager! at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1316) at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1624) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1689) at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:794) at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2470) at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2260) at android.support.v4.app.FragmentManagerImpl.optimizeAndExecuteOps(FragmentManager.java:2213) at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2122) at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:746) at android.os.Handler.handleCallback(Handler.java:769) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6535) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

No he hecho ningún cambio de código en absoluto.

¿Qué ha cambiado en Android O que los DialogFragments que funcionaban anteriormente ahora no se muestran?

Android Studio 3.0 Canary 1 Build #AI-171.4010489, built on May 15, 2017 JRE: 1.8.0_112-release-b736 x86_64 JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o Mac OS X 10.11.6 compileSdkVersion ''android-O'' buildToolsVersion "26.0.0-rc2" AndroidManifest.xml defaultConfig { minSdkVersion 16 targetSdkVersion ''O'' } compile ''com.android.support:appcompat-v7:26.0.0-beta1'' compile ''com.android.support:cardview-v7:26.0.0-beta1'' compile ''com.android.support:design:26.0.0-beta1'' compile ''com.android.support:percent:26.0.0-beta1'' dependencies { classpath ''com.android.tools.build:gradle:3.0.0-alpha1'' }


Acabo de enfrentar los mismos problemas en el proyecto en el que estoy trabajando cuando nos mudamos a Android Studio 3 y actualicé la biblioteca de soporte a la versión 26. De repente, sin cambiar el código, obtuvimos toneladas de esta excepción. Al final me enteré de lo siguiente:

Google agregó una nueva "comprobación de validez" en las fuentes del v4 Fragment Manager en enero de este año (no estoy seguro de qué versión fue) que se niega a agregar un fragmento usando un Fragment Manager, si tiene un conjunto de fragmentos objetivo y el destino El fragmento no se puede encontrar en los fragmentos activos del mismo Administrador de fragmentos. El parche se describe en detalle here

Parece que a las versiones Ealier no les ha importado eso. Tardé unos días en actualizar todas las áreas de nuestro código donde los fragmentos que se agregaron con el Administrador de fragmentos de soporte utilizaron el Administrador de fragmentos secundarios para sus subfragmentos con el fragmento principal como destino. Bueno, penalización tardía por escribir mal código.


Para mí esto no era solo un problema en Android O sino también en versiones anteriores. La versión más antigua que probé era el nivel 16 de API.

Estaba creando una instancia de mis fragmentos usando este código:

MyFragment myFragment = MyFragment.newInstance(); myFragment.setTargetFragment(ParentFragment.this, 0); myFragment.show(getActivity().getSupportFragmentManager(), null);

Donde ParentFragment.this es una clase personalizada que extiende android.support.v4.app.Fragment , MyFragment también extiende esta clase y es un fragmento secundario del fragmento ParentFragment (de ahí su nombre).

Pensé que tenía que usar un método getSupportFragmentManager() método getSupportFragmentManager() ) porque estoy usando un fragmento del paquete de soporte, así que intenté llamar a getActivity().getSupportFragmentManager() para obtener una referencia de actividad que apoyara este método.

Sin embargo, esta no parece ser la manera correcta. Cambié esas llamadas a:

MyFragment myFragment = MyFragment.newInstance(); myFragment.setTargetFragment(ParentFragment.this, 0); myFragment.show(getFragmentManager(), null);

por lo que el fragmento decide por su cuenta qué FragmentManager usar y el error desaparece ahora.

Espero que esto ayude a alguien.


Tuve el mismo caso que Markus Ressel pero estaba usando getChildFragmentManager (). Lo reemplacé con getFragmentManager () y resolví el problema.

ACTUALIZACIÓN: Ahora he estado trabajando con childFragmentManager y tengo algunos comentarios.

Cuando se trata de fragmentos internos que están alojados en un fragmento (por lo tanto, un fragmento dentro de un fragmento), utilice el administrador de recursos de niño. Este administrador de fragmentos difiere de las actividades getSupportFragmentManager. Los dos no son lo mismo. Es una separación de preocupaciones.

Así que he establecido la regla de que los fragmentos que alojan fragmentos secundarios siempre usarán childFragmentManager y que las cosas que no están dentro de los fragmentos de host pueden usar getSupportfragmentManager.


Tuve el mismo problema, definitivamente un error de Android. Ocurre cuando estás mostrando un fragmento de otro fragmento usándolo como objetivo. Como solución puede utilizar:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) getActivity().getFragmentManager().beginTransaction().add(dialogFrag, "dialog").commit(); else getChildFragmentManager().beginTransaction().add(dialogFrag,"dialog").commit();


mi aplicación funciona bien hasta que actualice la versión de destino a 27 y luego me encuentro con el mismo problema al llamar a setTargetFragment (Fragment Fragment, int requestCode)

ejemplo:

chooseRegionFragment.setTargetFragment(ParentFragment.this, REQUEST_CODE_CHOOSE_REGION);

solo cambia a

chooseRegionFragment.setTargetFragment(getRootParentFragment(this), REQUEST_CODE_CHOOSE_REGION);

getRootParentFragment(this) este método encontrará la raíz principal de los fragmentos para usted

/** * find root parent of fragment */ public static Fragment getRootParentFragment(Fragment fragment) { Fragment parent = fragment.getParentFragment(); if(parent == null) return fragment; else return getRootParentFragment(parent); }