1

Hello I am trying to send data between two fragments, (armarFragment to cocinaFragment) but I dont know how do it, because both are in the same Activity (tabsActivity) which implements a pagerAdaptar to show diferents fragments. Here I put my code. Thanks.

  1. tabsActivity.java (inside you can found the class pagerAdapter).

    public class tabsActivity extends AppCompatActivity {
    
    public MyFragmentPagerAdapter myFragmentPagerAdapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tabs);
    
        android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.appbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("Arma tu pizza");
    
        myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
    
        ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
        viewPager.setAdapter(myFragmentPagerAdapter);
    
        TabLayout tabLayout = (TabLayout) findViewById(R.id.appbartabs);
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
        tabLayout.setupWithViewPager(viewPager);
    
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_login, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
    
        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }
    
        return super.onOptionsItemSelected(item);
    }/*__________________ NEW CLASS, PAGERADAPTAR ____________________*/
    
    
    public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
        final int PAGE_COUNT = 4;
        String tabTitles[] =
                new String[] { "Inicio","Armar pizza","Cocina","Chef"};
    
        public MyFragmentPagerAdapter(FragmentManager fm) {
            super(fm);
        }
    
        @Override
        public int getCount() {
            return PAGE_COUNT;
        }
    
        @Override
        public Fragment getItem(int position) {
    
            Fragment f = null;
    
            switch(position) {
                case 0:
                    f = inicioFragment.newInstance();
                    break;
                case 1:
                    f = armarFragment.newInstance();
                    break;
                case 2:
                    f = cocinaFragment.newInstance();
                    break;
                case 3:
                    f = chefFragment.newInstance();
                    break;
            }
            return f;
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            // Generate title based on item position
            return tabTitles[position];
        }
    }}
    
  2. armarFregment.java (inside you can found a viewHolder but ignore that).

    public class armarFragment extends Fragment implements View.OnClickListener{
    
    View rootView;
    
    private RecyclerView recycler;
    private productoAdapter adapter;
    private RecyclerView.LayoutManager lManager;
    private EditText txtNombrePizza;
    
    private ArrayList<producto> productosSeleccionados;
    
    Button btnEnviarALaCocina;
    RadioButton pequeña;
    RadioButton mediana;
    RadioButton grande;
    
    
    public static armarFragment newInstance() {
        armarFragment fragment = new armarFragment();
        return fragment;
    }
    
    public armarFragment() {
        productosSeleccionados = new ArrayList<producto>();
    }
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
    }
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.fragment_armar, container, false);
    
        ArrayList<producto> items = new ArrayList<producto>();
    
        items.add(new producto(R.drawable.jamon, "Jamón", "¡Pssst!, sabe muy bien en pizzas dulces.", 2000));
        items.add(new producto(R.drawable.pollo, "Pollo","¡Pssst!, combina con TODO.",1500));
        items.add(new producto(R.drawable.queso, "Queso","Delicioso queso mozzarela, ¡Yummy Yummy!",2000));
        items.add(new producto(R.drawable.champinones, "Champiñones","Suculentos champiñones equixitos y suaves.",1500));
        items.add(new producto(R.drawable.peperoni, "Pepperoni","Fresco pepperoni con un toque de picante.",3000));
        items.add(new producto(R.drawable.pina, "Piña","¡Fresca y jugosa piña Colombiana papá!",1500));
        items.add(new producto(R.drawable.pasas, "Ciruelas pasas","Las más negritas y a la vez las más dulces.",1500));
        items.add(new producto(R.drawable.salami, "Salami","Delicioso salami en rodajitas así como el salchichon cervecero.",3000));
        items.add(new producto(R.drawable.chorizo, "Chorizo","¡Choricito santarrosano ome!",3000));
        items.add(new producto(R.drawable.cebolla, "Cebolla","La que ha hecho llorar a mas de uno, fresca y suave al paladar",1000));
        items.add(new producto(R.drawable.carnemolida, "Carne molida","Ideal para los arriesgados; fresca y deliciosa.",2500));
        items.add(new producto(R.drawable.pimenton, "Pimentón","Uno de los más enojados; crujiente y exquisito.",1000));
        items.add(new producto(R.drawable.tomate, "Tomate", "Otro rojo más; cosechados en nuestra tierrita.", 1000));
        items.add(new producto(R.drawable.maiz, "Maíz tierno","Se dice por ahi que el maíz es el más tierno",1000));
        items.add(new producto(R.drawable.jalapeno, "Jalapeño", "Si la cebolla te hace lorar imaginate este.", 2000));
        items.add(new producto(R.drawable.tocineta, "Tocineta","Deiciosa tocineta; ideal en pizzas de sal.",500));
        items.add(new producto(R.drawable.aceituna, "Aceituna", "Suaves y jugosas aceitunas, ideales para pizzas con proteinas.", 1000));
        items.add(new producto(R.drawable.oregano, "Orégano","El toque de sabor que nunca ha de faltar.",300));
        items.add(new producto(R.drawable.salsabbq, "Salsa BBQ", "La salsa ideal para pizzas de sal.", 500));
    
        recycler = (RecyclerView) rootView.findViewById(R.id.reciclador);
        recycler.setHasFixedSize(true);
    
        btnEnviarALaCocina = (Button) rootView.findViewById(R.id.btnEnviarALaCocina);
        btnEnviarALaCocina.setOnClickListener(this);
    
        txtNombrePizza = (EditText) rootView.findViewById(R.id.setNombrePizza);
    
        pequeña = (RadioButton) rootView.findViewById(R.id.radioPersonal);
        pequeña.setOnClickListener(this);
        mediana = (RadioButton) rootView.findViewById(R.id.radioMediana);
        mediana.setOnClickListener(this);
        grande = (RadioButton) rootView.findViewById(R.id.radioGrande);
        grande.setOnClickListener(this);
    
        // Usar un administrador para LinearLayout
        lManager = new LinearLayoutManager(getContext());
        recycler.setLayoutManager(lManager);
    
        // Crear un nuevo adaptador
        adapter = new productoAdapter(items);
    
        recycler.setAdapter(adapter);
    
        recycler.setItemAnimator(new DefaultItemAnimator());
    
        return rootView;
    }
    
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btnEnviarALaCocina:
    
                String nombrePizza = txtNombrePizza.getText().toString();
    
                productosSeleccionados = adapter.getProductosSeleccionados();
    
                Log.i("prueba 1", "size: " + productosSeleccionados.size());
    
                ArrayList<String> nombreProductos = new ArrayList<String>();
                ArrayList<Integer> precioProductos = new ArrayList<Integer>();
    
                for(producto p: productosSeleccionados){
                    nombreProductos.add(p.getNombre());
                    precioProductos.add(p.getPrecio());
                }
    
                if(productosSeleccionados.size() == 0){
    
                    Toast.makeText(getContext(), "Debes seleccionar ingredientes.",
                            Toast.LENGTH_LONG).show();
    
                }else if(nombrePizza.matches("")) {
    
                    Toast.makeText(getContext(), "Debes ponerle un nombre a la pizza.",
                            Toast.LENGTH_LONG).show();
                }else if(pequeña.isChecked() == false && mediana.isChecked() == false && grande.isChecked() == false){
    
                    Toast.makeText(getContext(), "Debes selecionar un tamaño.",
                            Toast.LENGTH_LONG).show();
                }
    
                break;
        }
    }
    
    /*______________________________________________________________________________________________
    NEW CLASS, PRODUCTOVIEWHOLDER
     _______________________________________________________________________________________________*/
    
    public class productoAdapter extends RecyclerView.Adapter<productoAdapter.productoViewHolder> {
    
        private ArrayList<producto> productosSeleccionados;
        private ArrayList<producto> productos;
    
        public class productoViewHolder extends RecyclerView.ViewHolder {
    
            // Campos respectivos de un item
            public ImageView imgProducto;
            public TextView txtNombre, txtDescripcion, txtPrecio;
            public Button btnAgregar;
    
            public productoViewHolder(View v) {
                super(v);
                imgProducto = (ImageView) v.findViewById(R.id.imgProducto);
                txtNombre = (TextView) v.findViewById(R.id.txtNombre);
                txtDescripcion = (TextView) v.findViewById(R.id.txtDescripcion);
                txtPrecio = (TextView) v.findViewById(R.id.txtPrecio);
                btnAgregar = (Button) v.findViewById(R.id.btnAgregar);
            }
        }
    
        public productoAdapter(ArrayList<producto> items) {
            productosSeleccionados = new ArrayList<producto>();
            this.productos = items;
        }
    
    
        public ArrayList<producto> getProductosSeleccionados(){
            return productosSeleccionados;
        }
    
        public int getItemCount() {
            return productos.size();
        }
    
        public productoViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View v = LayoutInflater.from(viewGroup.getContext())
                    .inflate(R.layout.card_productos, viewGroup, false);
    
            return new productoViewHolder(v);
        }
    
        public void onBindViewHolder(productoViewHolder viewHolder, final int i) {
            viewHolder.imgProducto.setImageResource(productos.get(i).getImagen());
            viewHolder.txtNombre.setText(productos.get(i).getNombre());
            viewHolder.txtDescripcion.setText(productos.get(i).getDescripion());
            viewHolder.txtPrecio.setText("$ " + String.valueOf(productos.get(i).getPrecio()));
            viewHolder.btnAgregar.setOnClickListener(new View.OnClickListener(){
    
                @Override
                public void onClick(View v) {
                    productosSeleccionados.add(productos.get(i));
    
                }
            });
        }
    }}
    
  3. cocinaFrgment.java (inside you can found a viewHolder but ignore that).

public class cocinaFragment extends Fragment {

View rootView;

private RecyclerView recycler;
private RecyclerView.Adapter adapter;
private RecyclerView.LayoutManager lManager;

ArrayList<pizza> items;

public static cocinaFragment newInstance() {
    cocinaFragment fragment = new cocinaFragment();
    return fragment;
}

public cocinaFragment() {
    items = new ArrayList<pizza>();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    rootView = inflater.inflate(R.layout.fragment_cocina, container, false);


    recycler = (RecyclerView) rootView.findViewById(R.id.reciclador);
    recycler.setHasFixedSize(true);

    // Usar un administrador para LinearLayout
    lManager = new LinearLayoutManager(getContext());
    recycler.setLayoutManager(lManager);

    // Crear un nuevo adaptador
    adapter = new pizzaAdapter(items);
    recycler.setAdapter(adapter);

    return rootView;
}


/*______________________________________________________________________________________________
NEW CLASS, PIZZAVIEWHOLDER
 _______________________________________________________________________________________________*/

public class pizzaAdapter extends RecyclerView.Adapter<pizzaAdapter.pizzaViewHolder> implements View
.OnClickListener{
    private ArrayList<pizza> pizzas;

    private View.OnClickListener listener;

    public class pizzaViewHolder extends RecyclerView.ViewHolder {
        // Campos respectivos de un item
        public TextView txtNombrePizza, txtTamaño, txtIngredientes, txtPrecio;

        public pizzaViewHolder(View v) {
            super(v);
            txtNombrePizza = (TextView) v.findViewById(R.id.txtNombrePizza);
            txtTamaño = (TextView) v.findViewById(R.id.txtTamaño);
            txtIngredientes = (TextView) v.findViewById(R.id.txtIngredientes);
            txtPrecio = (TextView) v.findViewById(R.id.txtPrecio);
        }
    }

    public pizzaAdapter(ArrayList<pizza> items) {
        this.pizzas = items;
    }


    public int getItemCount() {
        return pizzas.size();
    }


    public pizzaViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.card_pizzas, viewGroup, false);

        v.setOnClickListener(this);

        return new pizzaViewHolder(v);
    }

    public void setOnClickListener(View.OnClickListener listener) {
        this.listener = listener;
    }

    @Override
    public void onClick(View view) {
        if(listener != null)
            listener.onClick(view);
    }



    public void onBindViewHolder(pizzaViewHolder viewHolder, int i) {
        viewHolder.txtNombrePizza.setText(pizzas.get(i).getNombre());
        viewHolder.txtTamaño.setText(pizzas.get(i).getTamaño());
        viewHolder.txtIngredientes.setText(pizzas.get(i).getIngredientes());
        viewHolder.txtPrecio.setText("$ " + String.valueOf(pizzas.get(i).getPrecio()));
    }
}

}

Floern
  • 33,559
  • 24
  • 104
  • 119
  • Those fragments are individuals tabs, so, what kind of data you want to share? Anyway, to share data between fragements and activities android suggest the use of Listener interfaces. When you create a new fragment android-studio creates an interface by default. The Activity that instantiate that fragment must implements that interface. In that way when the fragment has something to tell to the ouside it can call a listener method. To share data between fragments and fragments you must do it through the activity that hold them. – Gonzalo Dec 10 '15 at 00:47
  • I want to tranfer ArrayList , ArrayList and Strings. – Óscar Daniel Dec 10 '15 at 00:56
  • Yes, but when do you want to transfer it? That data exchange must be in respond to some event or what? – Gonzalo Dec 10 '15 at 00:57
  • when I press the Button "btnEnviarALaCocina" which method OnClick is located in armarFragment. – Óscar Daniel Dec 10 '15 at 01:02
  • What Listener interface i must implements in my code to do that? – Óscar Daniel Dec 10 '15 at 01:04

1 Answers1

0

Ok, as android guidelines says, you must create an interface in your fragment. For example:

public class armarFragment extends Fragment implements View.OnClickListener{
    ...
    private armarFragmentListener mListener;

    public interface armarFragmentListener {
        void onEnviar ();
    }

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

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btnEnviarALaCocina:
            //Do what you want.
            mListener.onEnviar(/*Change interface to pass arguments if you want*/);
        break;
    }
}

Your activity must implements that interface and do what corresponds, for example call the methods of the fragment to get the data. When you have the data you can pass it to the new fragment as arguments or otherwise.

When you create a blank fragment in android studio it put that structure on the class by default. Create a new blank fragment and take a look at it.

Gonzalo
  • 1,781
  • 15
  • 29
  • Excuse me, what is "mListener" (I know that is and intance of "armarFragmentListener") in the method onclick(), how I must initialize that? – Óscar Daniel Dec 10 '15 at 01:27
  • It's in the code, declared on the top of the class, instatiated on the `onAttach()` method. If the context activity doesn't implement the interface you will get a class cast exception. – Gonzalo Dec 10 '15 at 01:29
  • Thanks bro, you're my god. – Óscar Daniel Dec 10 '15 at 01:31
  • Read guidelines and try to understand the autogenerated code before discard it, someone special wrote it for you :P – Gonzalo Dec 10 '15 at 01:33