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?

  • ¿Cómo escuchar los grifos y obtener vistas con Accessibility en Android?
  • Tipos de memoria de Android (RAM v Memoria interna)
  • Leer / dev / input / event en android a través del lenguaje de programación Java
  • ¿Por qué un Comparator debería implementar Serializable?
  • ¿Existe una función que convierte HTML en texto sin formato?
  • Plugin ADT para Android no aparece en Eclipse
  • Leer todos los SMS de un remitente en particular
  • Grabación de llamadas - hacer que funcione en Nexus 5X (posible ROM o ROM personalizado)
  • Casting un tipo largo de C ++ a un jlong ​​de JNI
  • Cómo ocultar el teclado virtual de Android en EditText
  • Quitar espacio adicional alrededor de GridView programaticamente
  • ¿Cómo inicio mi aplicación al inicio?
  • 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.