La actividad que aloja este fragmento se onActivityResult
llama cuando vuelve la actividad de la cámara.
Mi fragmento inicia una actividad para obtener un resultado con la intención de que la cámara tome una foto. La aplicación de imagen se carga bien, toma una foto y regresa. El onActivityResult
sin embargo nunca es golpeado. He establecido puntos de interrupción, pero no se activa nada. ¿Puede tener un fragmento onActivityResult
? Creo que sí, ya que es una función proporcionada. ¿Por qué no se desencadena esto?
ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 1888);
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if( requestCode == 1888 ) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
}
}
requestCode >= 0
!Respuestas:
La actividad de alojamiento se anula
onActivityResult()
, pero no hizo una llamada a lossuper.onActivityResult()
códigos de resultados no manejados. Aparentemente, aunque el fragmento es el que hace lastartActivityForResult()
llamada, la actividad tiene la primera oportunidad de manejar el resultado. Esto tiene sentido cuando se considera la modularidad de los fragmentos. Una vez que implementésuper.onActivityResult()
todos los resultados no manejados, el fragmento tuvo la oportunidad de manejar el resultado.Y también de @siqing respuesta:
Para obtener el resultado en su fragmento, asegúrese de llamar en
startActivityForResult(intent,111);
lugar degetActivity().startActivityForResult(intent,111);
dentro de su fragmento.fuente
getParentFragment().startActivityForResult
para que el fragmento primario tenga su método onActivityResult llamado.Creo que llamaste
getActivity().startActivityForResult(intent,111);
. Debe llamarstartActivityForResult(intent,111);
.fuente
RingtonePreference
ubicado enPreferenceFragment
. Desafortunadamente,RingtonePreference
llamagetActivity().startActivityForResult()
y no obtuve resultados a pesar de que llamésuper.onActivityResult
a la actividadonActivityResult
. Me vi obligado a crear un derivado de laRingtonePreference
clase, que se une a lasPreferenceFragment
llamadas yfragment.startActivityForResult()
.Opción 1:
Si está llamando
startActivityForResult()
desde el fragmento, debe llamarstartActivityForResult()
, nogetActivity().startActivityForResult()
, ya que dará como resultado el fragmento onActivityResult ().Si no está seguro de dónde está llamando
startActivityForResult()
y cómo llamará a los métodos.Opcion 2:
Como la actividad obtiene el resultado de
onActivityResult()
, deberá anular la actividadonActivityResult()
y llamarsuper.onActivityResult()
para propagarse al fragmento respectivo para obtener códigos de resultados no controlados o para todos.Si las dos opciones anteriores no funcionan, consulte la opción 3, ya que definitivamente funcionará.
Opcion 3:
Una llamada explícita del fragmento a la función onActivityResult es la siguiente.
En la clase de actividad principal, anule el método onActivityResult () e incluso anule el mismo en la clase Fragment y llame al siguiente código.
En la clase principal:
En la clase infantil:
fuente
setResult(); finish();
cuando presiono hacia atrás desde la segunda actividad, entonces tambiénonActivityResult
se me llama con provistoRESULT_CODE
.onActivityResult()
actividad devuelve un extrañorequestCode
que se pasa a mi fragmento y luego se ignora = /En caso de que no conozca fragmentos en su actividad, simplemente enumere todos y envíe argumentos de resultados de actividad:
fuente
Estoy teniendo el mismo problema con el
ChildFragmentManager
. El administrador no pasará el resultado al fragmento anidado, debe hacerlo manualmente en su fragmento base.fuente
Fragment fragment = myChildFragment;
para reemplazar lafindFragmentByTag
línea de código anterior. El resto puede mantenerse sin cambios.Publicación original
FragmentActivity
reemplazarequestCode
por uno modificado. Después de eso, cuandoonActivityResult()
se invoque,FragmentActivity
analiza los 16 bits superiores y restaura el índice del Fragmento original. Mira este esquema:Si tiene algunos fragmentos en el nivel raíz, no hay problemas. Pero si tiene fragmentos anidados , por ejemplo,
Fragment
con unas pocas pestañas en el interiorViewPager
, garantiza que se enfrentará a un problema (o ya lo enfrentó).Porque solo un índice se almacena dentro
requestCode
. Ese es el índice deFragment
su interiorFragmentManager
. Cuando usamos fragmentos anidados, hay elementos secundariosFragmentManager
, que tienen su propia lista de fragmentos. Por lo tanto, es necesario guardar toda la cadena de índices, comenzando desde la raízFragmentManager
.¿Cómo resolvemos este problema? Hay una solución alternativa común en esta publicación .
GitHub: https://github.com/shamanland/nested-fragment-issue
fuente
Este es uno de los temas más populares. Podemos encontrar muchos hilos sobre este tema. Pero ninguno de ellos es útil para mí.
Así que he resuelto este problema usando esta solución.
Primero entendamos por qué está sucediendo esto.
Podemos llamar
startActivityForResult
directamente desde Fragment, pero en realidad la mecánica detrás está a cargo de Activity.Una vez que llame
startActivityForResult
desde un Fragment, requestCode se cambiará para adjuntar la identidad de Fragment al código. Eso permitirá que Activity pueda rastrear a quienes envían esta solicitud una vez que se recibe el resultado.Una vez que se navegó de nuevo a Activity, el resultado se enviará a onActivityResult de Activity con el requestCode modificado que se decodificará con la identidad de requestCode + Fragment original. Después de eso, Activity enviará el Resultado de la Actividad a ese Fragmento a través de onActivityResult. Y todo está hecho.
El problema es:
Activity podría enviar el resultado solo al Fragment que se ha adjuntado directamente a Activity pero no al anidado. Esa es la razón por la cual onActivityResult de fragmento anidado nunca se llamaría sin importar qué.
Solución:
1) Comience la intención en su Fragmento con el siguiente código:
2) Ahora en su anulación de actividad para padres **
onActivityResult()
: **Tienes que llamar a esto en la actividad principal para que funcione.
3) En su fragmento de llamada:
Eso es. Con esta solución, se podría aplicar a cualquier fragmento individual, esté anidado o no. Y sí, ¡también cubre todo el caso! Además, los códigos también son agradables y limpios.
fuente
PARA MUCHOS FRAGMENTOS ANIDADOS (por ejemplo, cuando se usa ViewPager en un fragmento)
En su actividad principal :
En tu fragmento:
En tu fragmento anidado
Actividad de la llamada
uniqueInstanceInt : reemplácelo con un int que sea único entre los fragmentos anidados para evitar que otro fragmento trate la respuesta.
Recibir respuesta
Atención
Es necesario utilizar un número entre 0 y 65536 en uniqueInstanceInt para evitar errores "Solo se pueden usar 16 bits inferiores para requestCode".
fuente
Puedo agregar dos consejos si alguien aún no puede hacerlo. En el archivo Manifest.xml, asegúrese de que la actividad de alojamiento no haya finalizado cuando devuelva la llamada y que la actividad a iniciar tenga el modo de inicio como estándar. Vea los detalles a continuación:
Para la actividad de alojamiento, establezca la propiedad sin historial como falsa si tiene
Para iniciar la actividad, configure el modo de inicio como estándar si tiene
fuente
También estaba enfrentando el mismo problema una vez que cambié este bloque de código fuera de un Fragmento a una Clase de utilidad , con el argumento
parentActivity
pasado ,Entonces no estaba obteniendo ningún valor en el
onActivityResult
método de ese Fragmento , luego, cambié el argumento a Fragmento , por lo que la definición revisada del método se veía así,Después de eso, pude obtener valor en
onActivityResult
el Fragmentofuente
También me encontré con este problema en un Fragmento. Y llamé
startActivityForResult
a unDialogFragment
.Pero ahora este problema se ha resuelto:
FragmentClassname.this.startActivityForResult
.fuente
startActivityForResult(...)
desde una clase abstracta dentro del código del fragmento.PARA FRAGMENTOS ANIDADOS (por ejemplo, cuando se usa un ViewPager)
En su actividad principal:
En su fragmento principal de nivel superior (fragmento ViewPager):
En YourFragment (fragmento anidado):
fuente
En mi caso, fue un error de Android ( http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/ ), si usa el soporte
FragmentActivity
, debe usarlo engetSupportFragmentManager
lugar degetChildFragmentManager
:fuente
En breve,
En fragmento, declara
Fragment fragment = this
;después de ese uso
fragment.startActivityForResult
.El resultado volverá en activityResult.
fuente
Solución 1:
Llama en
startActivityForResult(intent, REQUEST_CODE);
lugar degetActivity().startActivityForResult(intent, REQUEST_CODE);
.Solución 2:
Cuando
startActivityForResult(intent, REQUEST_CODE);
se llama,onActivityResult(requestCode,resultcode,intent)
se invoca la actividad , y luego puede llamarfragments onActivityResult()
desde aquí, pasando elrequestCode, resultCode and intent
.fuente
Dentro de tu fragmento, llama
donde
this
se refiere al fragmento. De lo contrario, haga lo que dijo @Clevester:También tuve que llamar
en la actividad de los padres
onActivityResult
para que funcione.(Adapte esta respuesta de la respuesta de @ Clevester).
fuente
Para aquellos que utilizan Android de navegación de componentes debe utilizar en la actividad de
onActivityResult(...)
laprimaryNavigationFragment
conseguirlo es referencia fragmento y el fragmento de llamadafragment.onActivityResult(...)
.Aquí está la actividad
onActivityResult(...)
fuente
La mayoría de estas respuestas siguen diciendo que tienes que llamar
super.onActivityResult(...)
a tu anfitriónActivity
para tuFragment
. Pero eso no parecía estar funcionando para mí.Entonces, en su host
Activity
, debe llamar a suFragments
onActivityResult(...)
lugar. Aquí hay un ejemplo.En algún momento de su
HostActivity
necesitará asignarthis.myFragment
laFragment
que está utilizando. O utilice elFragmentManager
para obtener el enFragment
lugar de mantener una referencia a él en suHostActivity
. Además, verifiquenull
antes de intentar llamar althis.myFragment.onActivityResult(...);
.fuente
fuente
Simplemente puede anular BaseActivity
onActivityResult
en el fragmentobaseActivity.startActivityForResult
.En BaseActivity agregue la interfaz y anule onActivityResult.
En implementos Fragment
OnBaseActivityResult
Esta solución alternativa hará el truco.
fuente
Si el problema anterior se enfrenta al iniciar sesión en Facebook , puede usar el código siguiente en una actividad principal de su fragmento como:
O:
Y agregue la siguiente llamada en su fragmento ...
fuente
Otro caso de uso no descrito en otras respuestas:
onActivityResult()
declarado en fragmento no se invoca cuando se usaexception.startResolutionForResult()
:En este caso, reemplace
exception.startResolutionForResult()
con fragmentosstartIntentSenderForResult()
:fuente
Versión de Kotlin (en su actividad enActivityResult ())
fuente
Como mencionó Ollie C, hay un error activo para la biblioteca de soporte que utiliza valores devueltos a onActivityResult cuando está utilizando fragmentos anidados. Acabo de golpearlo :-(.
Ver Fragment.onActivityResult no llamado cuando requestCode! = 0 .
fuente
Tengo una fuerte sospecha de que todas las respuestas aquí no son más que hacks. Los he probado todos y muchos otros, pero sin ninguna conclusión confiable, ya que siempre hay algún tipo de problema estúpido. Por mi parte, no puedo confiar en resultados inconsistentes. Si mira la documentación oficial de la API de Android para Fragments, verá que Google establece claramente lo siguiente:
Ver: API de Android Fragment
Por lo tanto, parece que el enfoque más correcto y confiable sería llamar realmente a startActivityForResult () desde la actividad de alojamiento y también manejar el resultado en OnActivityResult () desde allí.
fuente
mActivity.startActivityFromFragment(this, intent, requestCode)
, por lo que no es más que una envoltura convenienteSu código tiene un fragmento anidado. Llamar a super.onActivityForResult no funciona
No desea modificar todas las actividades desde las que se puede llamar a su fragmento ni hacer un trabajo para llamar a cada fragmento de la cadena de fragmentos.
Aquí hay una de las muchas soluciones de trabajo. cree un fragmento sobre la marcha y conéctelo directamente a la actividad con el administrador de fragmentos de soporte. Luego llame a startActivityForResult desde el fragmento recién creado.
fuente
Mi problema fue con la actividad del host. Lo encontré con un conjunto,
android:launchMode="standard"
lo eliminé temporalmente y ¡funciona!fuente
onActivityResult no funcionará si su modo de inicio está establecido en SingleInstance o SingleTask. o llamas a tu actividad usando estos IntentFilters
standard
o elsingleTop
modo de inicio funcionará bien.fuente
Si está utilizando fragmentos anidados, esto también está funcionando:
Además de esto, debe llamar
super.onActivityResult
desde la actividad principal y completar elonActivityResult
método del fragmento.fuente
He manejado el problema escribiendo una clase base que se extiende
Fragment
, y enonactivityresult
la actividad he identificado el fragmento que se está ejecutando actualmente usandofragmenttag
. Luego llamo a un método definido por el usuario en la clase fragmentbase. Esto activará un evento en el fragmento actualmente en ejecución.fuente