He actualizado mi aplicación para usar la última biblioteca de soporte (versión 23.0.0), descubrí que desaprobaron la función onAttach () de la clase Fragment.
En vez de:
onAttach (Activity activity)
Nieva:
onAttach (Context context)
Como mi aplicación usa la actividad pasada antes de la depreciación, creo que una posible solución es:
@Override
public void onAttach(Context context) {
super.onAttach(context);
activity = getActivity();
}
¿Sería esa la forma correcta de hacerlo?
ACTUALIZAR:
Si ejecuto un dispositivo con API inferior a 23, ni siquiera se llama al nuevo onAttach (). ¡Espero que esto no sea lo que pretendían hacer!
ACTUALIZACIÓN 2:
El problema se ha resuelto con las últimas actualizaciones del SDK.
He probado en mi dispositivo API 22 y se está llamando a onAttach (Context).
Haga clic aquí para seguir el informe de error que abrí hace un par de semanas y las respuestas de los chicos de Google.
android
android-fragments
TareK Khoury
fuente
fuente
Context
? ¿No necesita unActivity
para adjuntar y mostrar un fragmento de todos modos? ¿De qué otra forma usará elContext
parámetro?onAttach(Context context)
que se llame a lo nuevo , debe usar un dispositivo que tenga al menos API 23 O usar android.support.v4.app.Fragment. Ver aquíRespuestas:
La actividad es un contexto, por lo que si simplemente puede verificar el contexto, es una actividad y emitirla si es necesario.
Actualización: Algunos afirman que
Context
nunca se llama a la nueva anulación. He realizado algunas pruebas y no puedo encontrar un escenario en el que esto sea cierto y, según el código fuente, nunca debería ser cierto. En todos los casos Probé, tanto pre y SDK23 post, tanto elActivity
y lasContext
versiones deonAttach
fueron llamados. Si puede encontrar un escenario en el que este no sea el caso, le sugiero que cree un proyecto de muestra que ilustre el problema y lo informe al equipo de Android .Actualización 2: solo uso los fragmentos de la Biblioteca de soporte de Android ya que los errores se corrigen más rápido allí. Parece que el problema anterior en el que las anulaciones no se llaman correctamente solo sale a la luz si usa los fragmentos de marco.
fuente
onAttach(Context)
ni siquiera parecen llamarse.onAttach(context)
que no se me llame.Este es otro gran cambio de Google ... La modificación sugerida: reemplazar
onAttach(Activity activity)
cononAttach(Context context)
mis aplicaciones bloqueadas en API anteriores yaonAttach(Context context)
que no se invocará en fragmentos nativos.Estoy usando los fragmentos nativos (android.app.Fragment), así que tuve que hacer lo siguiente para que funcione nuevamente en las API más antiguas (<23).
Aquí esta lo que hice:
fuente
Si utiliza los fragmentos de marco y la versión SDK del dispositivo es inferior a 23,
OnAttach(Context context)
no se llamaría.En su lugar, uso fragmentos de soporte, por lo que la desaprobación se corrige y
onAttach(Context context)
siempre se llama.fuente
Actualmente del
onAttach
código Fragment, no está claro si estaContext
es la actividad actual: Código fuenteSi echas un vistazo
getActivity
, verás la misma llamadaAsí que si usted quiere estar seguro de que está recibiendo la Actividad luego usar
getActivity()
(enonAttach
en tuFragment
), pero no se olvide de comprobarnull
porque simHost
esnull
será su actividadnull
fuente
fuente
Aunque parece que en la mayoría de los casos es suficiente
onAttach(Context)
, hay algunos teléfonos (es decir: Xiaomi Redme Note 2) donde no se llama, por lo que causa NullPointerExceptions. Entonces, para estar seguro, sugiero dejar también el método obsoleto:fuente
Descargue la biblioteca de soporte más reciente con el administrador de SDK e incluya
en gradle.app y configura la versión de compilación a la API 23
fuente
La respuesta a continuación está relacionada con esta advertencia de desaprobación que se produce en el tutorial Fragmentos en el sitio web para desarrolladores de Android y puede no estar relacionada con las publicaciones anteriores.
Usé este código en la lección del tutorial y funcionó.
Me preocupaba que la actividad pudiera ser nula como lo indica la documentación.
getActivity
FragmentActivity getActivity () Devuelve la FragmentActivity con la que este fragmento está asociado actualmente. Puede devolver nulo si el fragmento está asociado con un contexto en su lugar.
Pero onCreate en main_activity muestra claramente que el fragmento se cargó y, por lo tanto, después de este método, llamar a get activity desde el fragmento devolverá la clase main_activity.
getSupportFragmentManager (). beginTransaction () .add (R.id.fragment_container, firstFragment) .commit ();
Espero estar en lo correcto con esto. Soy un novato absoluto.
fuente
Probablemente estés usando
android.support.v4.app.Fragment
. Para esto, en lugar delonAttach
método, solo usegetActivity()
para obtener elFragmentActivity
con el que está asociado el fragmento. De lo contrario, podría usar elonAttach(Context context)
método.fuente
Esto funcionó para mí cuando definí la interfaz 'TopSectionListener', su comandante de actividad de objetos:
fuente