studio regresar pasar otro navegar llamar fragments fragmento entre destruir desde como cambiar boton android android-fragments

regresar - Android Fragment onAttach() en desuso



pasar de un fragmento a otro en android studio (9)

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 }


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 configura la versión de compilación a la API 23


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.


La respuesta a continuación está relacionada con esta advertencia de desaprobación 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 del 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 este fragmento está asociado actualmente. 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 correcto con esto. Soy un novato absoluto.


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


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