Comunicación entre fragment en Android con un listener

Blog >Lista Soluciones > Fragments II



Comunicación entre fragments 

Vamos con la continuación del post anterior en el que hablamos sobre los fragments, ahí encontrareis las clases para formar el código necesario para nuestra Activity con el combo de los 3 fragmentos.La habíamos acabado con este aspecto :




Vamos a cambiar subir 4 imágenes distintas, yo he usado las de unos amiguetes para que al pulsar en el listView de la izquierda cambie la descripción y la foto.


Cómo es la comunicación entre fragment 

Antes de seguir, es necesario saber como se comunican los fragment entre ellos, ya que a la hora de trabajar con ellos es indispensable. Para usar los componentes de cada uno debemos desarrollarlos de forma totalmente autocontenida (se refiere a todo lo que se encuentra en ella sin necesidad de recurrir a contenidos externos como vinculos) pudiendo asociarlos con una Activity para crear una interfad de usuario curiosa.


Lo más pro, es diseñando una interfaz, cosa que se explica aquí de forma muy correcta, ya que como otras veces digo, yo me enfoco más en la parte práctica del código. 

También podeis consultar la documentación oficial sobre ListFragment aquí.

En definitiva, creamos un "listener" mediante la interactuación de una interfaz con el main y el fragment Lista, lo tendremos que modificar :

Creamos una clase con nuestra interfaz

public interface InterfacePersonaSeleccionada {
 public void onPersonaSelect(item str);
}

Y después nuestro Fragment Lista lo dejamos así :

public class Fragment_Lista extends Fragment{
 //INTERACTUACION CON LA INTERFAD
 private InterfacePersonaSeleccionada listener;
 
    public void setListener(InterfacePersonaSeleccionada listener) {
        this.listener=listener;
    }
  
 private ListView listado;
 
 Fragment_Lista flist;
 FragmentDetalle fdetalle;
 FragmentFoto fFoto;
 
 private item[] datos =new item[]{
                new item("Paquito", "Rapper Boy", "Badajoz rules, I love my gym!!"),
                new item("Nona", "Vazquez Rebuenona", "Alternativa vividora"),
                new item("Pedro", "Peña Irlandes", "No es que sea serio, soy un borde"),
                new item("Lunares", "Romero Pochita", "Mi habibi")};
 
    @Override
    public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
 
  View v=inflater.inflate(R.layout.listado, container, false);
        return v;
    }
    
    public void onActivityCreated(Bundle state) {
        super.onActivityCreated(state);
 
        listado = (ListView)getView().findViewById(R.id.lista);
        listado.setAdapter(new AdapterList(this,datos));
        
        listado.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView list, View view, int pos, long id) {
                if (listener!=null) {
                    listener.onPersonaSelect(datos[pos]);

                }
            }
        });
    }


El adaptador lo he omitido pero sigue ahí en la misma clase , si os fijais bien el listener y el evento onClick interactúan en el método onActivityCreated que es cuando se acaba de crear el fragment, y en método setListener se nos obliga a implementar debido a las características de la interfaz. 

Si quereis documentación a cerca de qué son las interfaces y para qué valen, podeis encontrarla aquí.

El tema es bastante abstracto y por desgracia más de uno no sabe para que sirve.... asi que si optas por no aprender su uso, cagada!! Hay millones de veces que gracias a las interfaces todo sale más técnico, correcto y por lo tanto, más profesional.

Y ya por último nuestro main :

public class MainActivity extends FragmentActivity  implements InterfacePersonaSeleccionada{
 
 //METODO DE LA INTERFAD, NUESTRO "LISTENER"
 @Override
 public void onPersonaSelect(item str) {
  // TODO Auto-generated method stub
  //REFERENCIAMOS LOS 2 FRAGMENTOS
  FragmentFoto fFoto =(FragmentFoto) getSupportFragmentManager().findFragmentById(R.id.fragmentFoto);
  FragmentDetalle fDetalle=(FragmentDetalle) getSupportFragmentManager().findFragmentById(R.id.fragmentDetalle);
  //ASIGNAMOS LOS VALORES
  fFoto.cambiarFoto(AsignarFoto(str));
  fDetalle.cambiarTexto(str.getDescripcion());
 }
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
  Fragment_Lista LISTA = 
    (Fragment_Lista) getSupportFragmentManager().findFragmentById(R.id.fragmentLista);
  LISTA.setListener(this);
        
        
    }
 //FUNCION PARA ASIGNAR LA FOTO SEGUN EL OBJETO QUE NOS DE LA INTERFAZ AL HACER CLICK EN LA LISTA
    public Drawable AsignarFoto(item str){
     Drawable foto = null;
     
     if(str.getName().compareTo("Paquito")==0){
      foto = getResources().getDrawable(R.drawable.foto1);
     }else if(str.getName().compareTo("Nona")==0){
      foto = getResources().getDrawable(R.drawable.foto2);
     }else if(str.getName().compareTo("Pedro")==0){
      foto = getResources().getDrawable(R.drawable.foto3);
     }else if(str.getName().compareTo("Lunares")==0){
      foto = getResources().getDrawable(R.drawable.foto4);
     }
     return foto;
    }



Podeis descargar el código fuente de thebestandroide con sólo compartir en facebook,twitter,linkedin o suscribirte a nuestro canal RSS más abajo. 


Compartir Compartir Compartir Compartir



2 comentarios:

  1. Hola, En el activity_main.xml porque usas un FrameLayout ? se podría usar simplemente LinearLaout. Cual es el motivo?. Gracias

    ResponderEliminar
  2. Casino in San Diego (California) - Mapyro
    The casino features over 1600 slot machines, table games, poker 충청북도 출장안마 machines, and 전라남도 출장샵 live entertainment. In addition to 과천 출장마사지 a 100-table poker room, 아산 출장마사지 the property 나주 출장마사지 also

    ResponderEliminar