com.android.support:appcompat-v7 last version
Android: onAttach(Contexto) no se requiere para API 23 (7)
He actualizado el SDK a la última versión (API 23) y el
onAttach(Activity)
para el fragmento está en desuso.
Entonces, en lugar de usar ese método, ahora estoy usando
onAttach(Context)
pero este no se llama durante el ciclo de vida.
La actividad es una instancia de
AppCompatActivity
de v7 y el fragmento es una instancia de la clase Fragment (
android.app.Fragment
).
¿Alguna idea de cómo hacer que el
onAttach
funcione en API 23?
Solución
Encontré algunas respuestas que pueden ayudarlo a comprender y solucionar este problema:
Soluciones:
-
El uso de getSupportFragmentManager () te obligará a usar un Fragment de la biblioteca de soporte. Entonces, la primera solución es reemplazar todos los fragmentos con el fragmento de support lib y usar getSupportFragmentManager ().
-
La solución que ya he implementado es manejar 2 posibilidades (1. la aplicación se ejecuta en un dispositivo con API <23, la aplicación se ejecuta en un dispositivo con API> = 23).
En breve, en mi implementación, tengo una clase base para todos los fragmentos del proyecto y agregué este código allí:
/*
* onAttach(Context) is not called on pre API 23 versions of Android and onAttach(Activity) is deprecated
* Use onAttachToContext instead
*/
@TargetApi(23)
@Override
public final void onAttach(Context context) {
super.onAttach(context);
onAttachToContext(context);
}
/*
* Deprecated on API 23
* Use onAttachToContext instead
*/
@SuppressWarnings("deprecation")
@Override
public final void onAttach(Activity activity) {
super.onAttach(activity);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
onAttachToContext(activity);
}
}
/*
* Called when the fragment attaches to the context
*/
protected void onAttachToContext(Context context) {
}
Ahora simplemente anulo el método onAttachToContext (Context) en todos los fragmentos donde necesito esto.
Debería intentar usar la versión de la biblioteca de soporte de Fragment.
Debe cambiar para
import android.support.v4.app.Fragment;
en lugar de
import android.app.Fragment;
.
También deberás asegurarte de que estás usando
getSupportFragmentManager()
lugar de
getFragmentManager()
.
Después de leer su respuesta @David Rauca, creo que la segunda puede resolver mi problema.
Pero
cuando miro el código fuente.
Encontré que, en realidad,
onAttach(Context context)
no hace nada en Android M, simplemente llamó al método anterior.
Como solución:
@SuppressWarnings("deprecation")
Solo agregarlo al método anterior es la mejor solución.
He encontrado el mismo problema. Lo que he hecho para resolverlo:
-
Cambie el tipo de argumento de devolución de llamada onAttach de Actividad a Contexto . Por razones desconocidas, esta modificación da como resultado el hecho de que el método onAttach (Context) ya no se llama durante el ciclo de vida del fragmento. Como consecuencia, mi aplicación se bloqueó ya que el código que estaba en el método onAttach nunca se ha ejecutado.
-
Mueva el código que estaba en el método onAttach para onCreate uno ya que todavía se ejecuta.
Con esta modificación, la aplicación pasa a funcionar como antes.
No se requieren declaraciones de
import
adicionales.
Resolví el problema de esta manera:
@TargetApi(23)
@Override public void onAttach(Context context) {
//This method avoid to call super.onAttach(context) if I''m not using api 23 or more
//if (Build.VERSION.SDK_INT >= 23) {
super.onAttach(context);
onAttachToContext(context);
//}
}
/*
* Deprecated on API 23
* Use onAttachToContext instead
*/
@SuppressWarnings("deprecation")
@Override public void onAttach(Activity activity) {
super.onAttach(activity);
if (Build.VERSION.SDK_INT < 23) {
onAttachToContext(activity);
}
}
/*
* This method will be called from one of the two previous method
*/
protected void onAttachToContext(Context context) {}
Se me ocurrió el mismo problema. Tengo una minSdkVersion de 19 y una targetSdkVersion de 23 y estoy usando fragmentManager en una AppCompatActivity.
onAttach(Activity activity)
está marcado como obsoleto, pero me encontré con bloqueos de la aplicación cuando lo
reemplacé
con
onAttach(Context context)
.
Entonces, en cambio, ahora tengo
ambas versiones presentes
y cuando ejecuto mi aplicación en API22, se
onAttach(Activity activity)
, aunque esté marcado como obsoleto.
No lo he probado en un dispositivo Android Marshmallow, pero tengo entendido que ejecutaría la
onAttach(Context context)
, ignorando la otra.
Actualice para tener en cuenta la observación de @ skaar en los comentarios a continuación: ahora podría probar en API23 y puedo confirmar que la ejecución en la plataforma 23 hace que se invoquen ambos métodos (con Actividad y Contexto). ¡Gracias por el aviso!
por favor publique sobre este ERROR aquí
NÚMERO ABIERTO EN EL SITIO WEB DEL PROYECTO GOOGLE AOSP:
https://code.google.com/p/android/issues/detail?id=185465
PD. este no es su trabajo para buscar una solución a este problema y encontrar cualquier tipo de solución ... ¡sino obligar a Google a corregir su API rota! para hacer esto necesitas quejarte como dije.
problema relacionado: getContext () del fragmento:
@Override
public void onAttach(Context context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
super.onAttach(context);
onAttachToContext(context);
} else {
Activity activity = getActivity();
super.onAttach(activity);
onAttachToContext(activity);
}
}