android-fragments pasar - Fragmento de Android en Ataque()en desuso




cambiar desde (9)

probablemente esté utilizando 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) .

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 lugar de:

onAttach (Activity activity)

Nieva:

onAttach (Context context)

Como mi aplicación usa la actividad pasada antes de la depreciación, creo que una solución posible 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 errores que abrí hace un par de semanas y las respuestas de los chicos de Google.


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

Descargue la biblioteca de soporte más nueva con el administrador sdk e incluya

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

en gradle.app y configura la versión de compilación a api 23


@Override
public void onAttach(Context context) {
    super.onAttach(context);

    Activity activity = context instanceof Activity ? (Activity) context : null;
}

La respuesta a continuación está relacionada con esta advertencia de desaprobación que aparece en el tutorial Fragmentos en el sitio web del desarrollador de Android y puede que no esté relacionada con las publicaciones anteriores.

Utilicé 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 dice la documentación.

getActivity

FragmentActivity getActivity () Devuelve la FragmentActivity a la que está asociado actualmente este fragmento. 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 cierto con esto. Soy un novato absoluto.


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

En lugar de eso, uso fragmentos de soporte, por lo que la onAttach(Context context) está solucionada y onAttach(Context context) siempre se llama.


La actividad es un contexto, por lo tanto, si simplemente puede verificar, el contexto es una actividad y lanzarlo 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 al nuevo reemplazo 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 donde este 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 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 utiliza los fragmentos de la estructura.


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. Así que para estar en el lado seguro, sugiero dejar el método obsoleto 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
}

La mejor manera de crear una instancia del fragmento es usar el método Fragment.instantiate predeterminado o crear un método de fábrica para crear una instancia del fragmento.
Precaución: siempre cree un constructor vacío en el fragmento otro mientras se restaura la memoria de fragmentos se generará una excepción en tiempo de ejecución.







android android-fragments