support last android appcompat android-appcompat

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:

  • Como mencioné antes, estoy usando la actividad del soporte v7 (AppCompatActivity) y el fragmento de android.app.

  • Para mostrar fragmentos, obtengo el administrador de fragmentos usando el método getFragmentManager en la actividad, por lo que el administrador de fragmentos es una instancia de FragmentManager de android.app -> y aquí está el problema

  • Si ejecuta la aplicación en un dispositivo con API 23 (la he ejecutado en el emulador AS), verá que se llamará al método onAttach (Context). Durante el proceso para mostrar un fragmento por el FragmentManager, en un momento específico se llama al método onAttach (..). Usando getFragmentManager () obtendrá una instancia del administrador de fragmentos disponible para la versión de Android que se ejecuta en ese dispositivo (por ejemplo, API 22, 23). En caso de que la aplicación se ejecute en un dispositivo con API <23, el método onAttach (Contexto) no está disponible, el administrador de fragmentos no sabe que en la API 23 hay un método onAttach (Contexto), por eso no se llama para la API <23 -> la solución para este tipo de problemas es usar el FragmentManager de las bibliotecas de soporte.

  • Soluciones:

    1. 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 ().

    2. 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:

    1. 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.

    2. 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!



    @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); } }