studio - regresar de un fragment a otro android




Android Fragment onAttach() en desuso (6)

Actualmente del código de Fragmento de 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 echa un vistazo a getActivity , verá la misma llamada

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

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

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 una 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 here para seguir el informe de error que abrí hace un par de semanas y las respuestas de los chicos de Google.


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) donde no se llama, por lo que causa NullPointerExceptions. Entonces, para estar seguro, sugiero dejar también el método obsoleto:

// 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
}

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

La actividad es un contexto, por lo que si simplemente puede verificar el contexto, es 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 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 que probé, tanto antes como después de SDK23, se llamaron las versiones Activity y Context de onAttach . 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.


Si utiliza los fragmentos de marco y la versión SDK del dispositivo es inferior a 23, no se OnAttach(Context context) .

En su lugar, utilizo fragmentos de soporte, por lo que la desaprobación se corrige y siempre se llama a onAttach(Context context) .


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





android-fragments