Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


OnAttach (Activity) obsoleto: donde puedo comprobar si la actividad implementa la interfaz de devolución de llamada

Antes de la API 23 usé los métodos onAttach de Fragment para obtener mi instancia de escucha, entonces la referencia se limpia dentro de onDetach. ex:

@Override public void onAttach(Activity activity) { super.onAttach(activity); mListener = null; try { mListener = (SellFragmentListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement SellFragmentListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } 

¿Es seguro hacer el mismo cheque dentro de Atacar (Contexto contextual) o hay una mejor manera de obtener la instancia de actividad titular?

  • Recuperación de todos los recursos extraíbles del objeto Recursos
  • Nuevo ícono oficial para Android Navigation Drawer
  • No se puede instalar la hormiga correctamente para phonegap utilizando eclipse y windows 8
  • No se puede instanciar la clase android.support.v7.widget.SearchView
  • Cuando se utiliza un proyecto de biblioteca de Android, ¿cómo se hace referencia a los recursos xml correctamente?
  • Android - dibujo de caché - ¿Cuándo es útil?
  • Cargando un recurso de Android en un WebView
  • Vista Web de Android: la página web debe ajustarse a la pantalla del dispositivo
  • Java.lang.RuntimeException: falló la toma de imagen
  • ¿Qué es más seguro: navegador externo o ChromeTab para autorización?
  • No se pudo encontrar la herramienta de compilación revisión 23.0.1
  • Cómo hacer un Spinner de Android con el texto inicial "Seleccionar uno"
  • 6 Solutions collect form web for “OnAttach (Activity) obsoleto: donde puedo comprobar si la actividad implementa la interfaz de devolución de llamada”

    Compruebe el código fuente:

     /** * Called when a fragment is first attached to its context. * {@link #onCreate(Bundle)} will be called after this. */ public void onAttach(Context context) { mCalled = true; final Activity hostActivity = mHost == null ? null : mHost.getActivity(); if (hostActivity != null) { mCalled = false; onAttach(hostActivity); } } /** * @deprecated Use {@link #onAttach(Context)} instead. */ @Deprecated public void onAttach(Activity activity) { mCalled = true; } 

    Por lo tanto, el onAttach(Activity activity) es llamado por el onAttach(Context context) si hay una actividad de acogida. Puede utilizar el onAttach(Activity activity) forma segura.

    Bueno, lo que está obsoleto es onAttach(Activity activity); Método, pero todo el flujo sigue siendo. Así que usted no puede hacer nada realmente como onAttach(Activity activity); Se va a seguir apoyando el tiempo suficiente.

    Nunca tuve que usar onAttach(Context context) pero creo que su código es básicamente bueno. Así que aquí está mi sugerencia, usando su código:

     public void onAttach (Context context) { super.onAttach(context); try { Activity activity = (Activity) context; mListener = (SellFragmentListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " must implement SellFragmentListener"); } } 

    La principal diferencia es que puedo encasillar el context para obtener la Actividad. Esto se debe a que Context puede propagarse a la subclase que es la actividad.

    Otro problema, el API 23 todavía está lejos de ahora para preocuparnos. Si usted se preocupa, usar el pragma de la estructura (estructura estática) puede ser una buena opción.

    Como se muestra en la respuesta de Zsolt Mester, onAttach(Activity activity) es obsoleta en favor de onAttach(Context context) . Por lo tanto, todo lo que necesita hacer es comprobar para asegurarse de que el contexto es una actividad.

    En Android Studio si va a Archivo> Nuevo> Fragmento , puede obtener el código generado automáticamente que contendrá la sintaxis adecuada.

     import android.support.v4.app.Fragment; ... public class MyFragment extends Fragment { private OnFragmentInteractionListener mListener; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // inflate fragment layout return inflater.inflate(R.layout.fragment_myfragment, container, false); } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof OnFragmentInteractionListener) { mListener = (OnFragmentInteractionListener) context; } else { throw new RuntimeException(context.toString() + " must implement OnFragmentInteractionListener"); } } @Override public void onDetach() { super.onDetach(); mListener = null; } public interface OnFragmentInteractionListener { // TODO: Update argument type and name void onFragmentInteraction(Uri uri); } } 

    Notas

    • Dado que la actividad primaria debe implementar nuestro OnFragmentInteractionListener (la interfaz denominada de forma arbitraria), la comprobación (context instanceof OnFragmentInteractionListener) garantiza que el contexto sea realmente la actividad.

    • Tenga en cuenta que estamos utilizando la biblioteca de soporte. De onAttach(Context context) contrario onAttach(Context context) no sería llamado por pre API 23 versiones de Android.

    Ver también

    • Creación y uso de fragmentos
    • Android Fragment onAttach () desaprobado

    He enfrentado la misma situación. He pasado por varios puestos y finalmente implementado mi código en el bloque onCreate () de fragment.Till ahora no he enfrentado ningún problema y creo que no sería un problema como onCreate se llama inmediatamente después onAttach en ciclo de vida.

      @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); try { listnener = (TilesOnClickListnener)getActivity(); } catch (ClassCastException e) { throw new ClassCastException(getActivity().toString() + " must implement OnArticleSelectedListener"); } } 
      public class MainActivity extends AppCompatActivity implements topsection.TopSectionListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void createMeme(String top, String bottom){ bottomsection fragmentbottom = (bottomsection) getSupportFragmentManager().findFragmentById(R.id.fragment2); fragmentbottom.setMemeText(top, bottom); } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.