Android Fragment onAttach () obsoleto

He actualizado mi aplicación para usar la última biblioteca de soporte (versión 23.0.0). Descubrí que desaprobaban la función onAttach () de la clase Fragment.

En lugar de:

onAttach (Activity activity) 

Nieva:

 onAttach (Context context) 

Como mi aplicación utiliza la actividad aprobada antes de la degradación, una posible solución, creo, 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, el nuevo onAttach () ni siquiera se está llamando. ¡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 ontach (Contexto).

Haga clic aquí para seguir el informe de error que abrí hace un par de semanas y las respuestas de los chicos de Google.

La actividad es un contexto, por lo que si simplemente puede verificar el contexto, se trata de una Actividad y emitirla si es necesario.

 @Override public void onAttach(Context context) { super.onAttach(context); Activity a; if (context instanceof Activity){ a=(Activity) context; } } 

Actualización: algunos afirman que nunca se llama a la nueva anulación de Context . He hecho algunas pruebas y no puedo encontrar un escenario donde esto sea cierto y de acuerdo con el código fuente, nunca debería ser cierto. En todos los casos que probé, tanto antes como después de SDK23, se llamaron tanto la Activity como las versiones de Context de onAttach . Si puede encontrar un escenario donde no es 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 porque los errores se reparan más rápido allí. Parece que el problema anterior donde las anulaciones no se llaman correctamente solo sale a la luz si usas los fragmentos del marco.

Este es otro gran cambio de Google … La modificación sugerida: reemplazar onAttach(Activity activity) con onAttach(Context context) colisionó mis aplicaciones en API más antiguas, ya que no se onAttach(Context context) 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 antiguas (<23).

Aquí esta lo que hice:

 @Override public void onAttach(Context context) { super.onAttach(context); // Code here } @SuppressWarnings("deprecation") @Override public void onAttach(Activity activity) { super.onAttach(activity); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) { // Code here } } 

Si usa los fragmentos del marco de trabajo y la versión del SDK del dispositivo es menor que 23, no se OnAttach(Context context) .

En su lugar, utilizo fragmentos de soporte, por lo que la onAttach(Context context) es fija y onAttach(Context context) siempre se llama.

Actualmente, a partir del código del fragmento onAttach , no está claro si el Context es la actividad actual: código fuente

 public void onAttach(Context context) { mCalled = true; final Activity hostActivity = mHost == null ? null : mHost.getActivity(); if (hostActivity != null) { mCalled = false; onAttach(hostActivity); } } 

Si getActivity un vistazo a getActivity , verás la misma llamada

 /** * Return the Activity this fragment is currently associated with. */ final public Activity getActivity() { return mHost == null ? null : mHost.getActivity(); } 

Entonces, si quiere estar seguro de que está obteniendo la Actividad, use getActivity() (en onAttach en su Fragment ) pero no olvide verificar null porque si mHost es null su actividad será null

 @Override public void onAttach(Context context) { super.onAttach(context); Activity activity = context instanceof Activity ? (Activity) context : null; } 

Descargue la biblioteca de Soporte más reciente con el administrador de SDK e incluya

 compile 'com.android.support:appcompat-v7:23.1.1' 

en gradle.app y establece la versión de comstackción para api 23

La respuesta a continuación está relacionada con esta advertencia de obsolescencia 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 tutorial y funcionó.

 public void onAttach(Context context){ super.onAttach(context); Activity activity = getActivity(); 

Me preocupaba que la actividad pudiera ser nula como lo indica la documentación.

getActivity

FragmentActivity getActivity () Devuelve la FragmentActivity con la que está asociado actualmente este fragmento. Puede devolver nulo si el fragmento está asociado con un contexto en su lugar.

Pero onCreate en la actividad_principal muestra claramente que el fragmento se cargó y, por lo tanto, después de este método, al llamar a la actividad get del fragmento se devolverá la clase main_activity.

getSupportFragmentManager (). beginTransaction () .add (R.id.fragment_container, firstFragment) .commit ();

Espero estar en lo correcto con esto. Soy un absoluto novato.

probablemente estés usando android.support.v4.app.Fragment . Para este método en lugar de onAttach , simplemente use getActivity() para obtener FragmentActivity con el que está asociado el fragmento. De lo contrario, podría usar el onAttach(Context context) .

Aunque parece que en la mayoría de los casos es suficiente tener onAttach(Context) , hay algunos teléfonos (es decir: Xiaomi Redme Note 2) en los que no se está llamando, por lo que causa NullPointerExceptions. Entonces, para estar seguro, sugiero dejar el método en desuso también:

 // onAttach(Activity) is necessary in some Xiaomi phones @SuppressWarnings("deprecation") @Override public void onAttach(Activity activity) { super.onAttach(activity); _onAttach(activity); } @Override public void onAttach(Context context) { super.onAttach(context); _onAttach(context); } private void _onAttach(Context context) { // do your real stuff here }