Pierre
Pierre

Reputation: 1

How to pass an Object from one fragment to other fragment

I want to pass my total entity (Incidencia) who is created in One fragment and pass it to another fragment who will show a list of each entity added before. Both fragments are inside of one Activity. Im using recyclerview to list the entities and this entity implements parcelable.

This is the main activity who contain both fragments

    public class MainActivity extends ActionBarActivity implements IngresoIncidenciaTroncalFragment.OnButtonClickedListener{


        DrawerLayout mDrawerLayout;
        NavigationView mNavigationView;
        FragmentManager mFragmentManager;
        FragmentTransaction mFragmentTransaction;

     @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

       final Toolbar mitoolbar = (Toolbar) findViewById(R.id.toolbar);
                 mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
                 mNavigationView = (NavigationView) findViewById(R.id.shitstuff) ;
            setSupportActionBar(mitoolbar);


     mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
                 @Override
                 public boolean onNavigationItemSelected(MenuItem menuItem) {
                    mDrawerLayout.closeDrawers();

                     if (menuItem.getItemId() == R.id.nav_item_ingresoIncidencia) {
                         FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
                         fragmentTransaction.replace(R.id.containerView,new IngresoIncidenciaTroncalFragment()).commit();
                         mitoolbar.setTitle("Ingreso Incidencia Troncal");
                     }

                    else if (menuItem.getItemId() == R.id.nav_item_listarIncidencia) {
                         FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
                         fragmentTransaction.replace(R.id.containerView,new ListaIncidenciasTroncalFragment()).commit();
                         mitoolbar.setTitle("Lista Incidencias Troncal");

                     }

                     return false;
                }

            });
    android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
                    ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout, toolbar,R.string.app_name,
                    R.string.app_name);

                    mDrawerLayout.setDrawerListener(mDrawerToggle);

                    mDrawerToggle.syncState();
      }

    //THIS IS THE METHOD WHO DOESNT WORK
    //WHAT CONTAINER DO I HAVE TO WRITE? THE ACTIVITY CONTAINER? OR FRAGMENT ONE OR TWO CONTAINERS?
    @Override
        public void onButtonClicked(Incidencia incidencia){
            IngresoIncidenciaTroncalFragment fragment = new IngresoIncidenciaTroncalFragment();
            Bundle args = new Bundle();
            args.putParcelable("incident", incidencia);
            fragment.setArguments(args);
            getSupportFragmentManager().beginTransaction().replace(R.id.containerView, fragment).commit();
        }
 @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_main, menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        int id = item.getItemId();

        return super.onOptionsItemSelected(item);
    }
}

This is the fragment who will add the entity

public class IngresoIncidenciaTroncalFragment extends Fragment implements
        FechaDialog.DatePickerDialogFragmentEvents,HoraDialog.TimePickerDialogFragmentEvents ,FechaLlegadaDialog.DateLlegadaPickerDialogFragmentEvents{

    private TextView mDateDisplay;
    private TextView mTimeDisplay;
    private Button botonAgregaIncidencia;
    Context context;
    private OnButtonClickedListener mListener;
    private Spinner spinnerFallas;



    public interface OnButtonClickedListener {
        void onButtonClicked(Incidencia incidencia);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        /**
         *Inflate ingresoincidenciastroncal and setup Views.
         */
            final View x =  inflater.inflate(R.layout.ingresoincidenciastroncal,null);
        context = x.getContext();

        mHoraLLegadaEstacion=(TextView)x.findViewById(R.id.tvHoraLLegadaEstacion);
        mObservaciones=(TextView)x.findViewById(R.id.tvObservaciones);
        mFechaSolucion=(TextView)x.findViewById(R.id.tvFechaSolucion);
        mHoraSolucion=(TextView)x.findViewById(R.id.tvHoraSolucion);


        //ADD ENTITY BUTTON
        botonAgregaIncidencia=(Button) x.findViewById(R.id.btnAgregarIncidencia);
        botonAgregaIncidencia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {   
                //CREATING NEW ENTITY(Incidencia) 
                Incidencia incidencia = new Incidencia();
                incidencia.setFechaRegistro(mDateDisplay.toString());
                incidencia.setHoraSolucion(mTimeDisplay.toString());
                incidencia.setTipoFalla(spinnerFallas.getPrompt().toString());

                //NEW ENTITY AS PAREMETER
                mListener.onButtonClicked(incidencia);

            }
        });




            return x;

    }

}

This is the fragment who will show the list of entities

public class ListaIncidenciasTroncalFragment extends Fragment {

    Context context;


    GestureDetector detector;


    private RecyclerView rvListaIncidencias;
    private ListaIncidenciasTroncalAdapter mlistaIncidenciasTroncalAdapter;

    public ListaIncidenciasTroncalFragment() {

    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        final View x =  inflater.inflate(R.layout.listaincidenciastroncalfragment,null);
        context = x.getContext();

        detector = new GestureDetector(getActivity(), new RecyclerViewOnGestureListener());

        rvListaIncidencias=(RecyclerView)x.findViewById(R.id.rv_listaIncidenciasTroncal);
        rvListaIncidencias.setLayoutManager(new LinearLayoutManager(getContext()));
        mlistaIncidenciasTroncalAdapter = new ListaIncidenciasTroncalAdapter();
        rvListaIncidencias.setAdapter(mlistaIncidenciasTroncalAdapter);



        //HERE I SUPPOSE TO GET OBJECT CREATED FROM FRAGMENTONE
        Bundle args = getArguments();
        Incidencia incidencia = args.getParcelable("incident");
        mlistaIncidenciasTroncalAdapter.add(incidencia);

        return x;
    }
}

This is the recyclerview adapter

public class ListaIncidenciasTroncalAdapter extends RecyclerView.Adapter<ListaIncidenciasTroncalAdapter.ListaIncidenciasTroncalAdapterViewHolder>
         {

    private List<Incidencia> mLstIncidencia = new ArrayList<>();
    //private OnItemClickListener listener;


    public void add(Incidencia incidencia){
        mLstIncidencia.add(incidencia);
        notifyItemInserted(mLstIncidencia.size()-1);
    }



    @Override
    public ListaIncidenciasTroncalAdapter.ListaIncidenciasTroncalAdapterViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listaincidencias_item,parent,false);
        ListaIncidenciasTroncalAdapterViewHolder  mlistaIncidenciasTroncalAdapterViewHolder = new ListaIncidenciasTroncalAdapterViewHolder(view);
        return mlistaIncidenciasTroncalAdapterViewHolder;
    }

    @Override
    public void onBindViewHolder(ListaIncidenciasTroncalAdapter.ListaIncidenciasTroncalAdapterViewHolder holder, final int position) {

        final Incidencia incidencia= mLstIncidencia.get(position);
        holder.tv_FechaRegistro.setText("Registro: "+incidencia.getFechaRegistro()+" - "+incidencia.getHoraRegistro());
        holder.tv_Falla.setText(incidencia.getTipoFalla());
        holder.tv_Estacion.setText(incidencia.getNomEstacion());
        holder.tv_FechaSolucion.setText("Solucion: "+incidencia.getFechaSolucion()+" - "+incidencia.getHoraSolucion());


    }

    @Override
    public int getItemCount() {
        return mLstIncidencia.size();
    }


    static class ListaIncidenciasTroncalAdapterViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        //private OnItemClickListener listener;
        TextView tv_FechaRegistro, tv_Falla, tv_Estacion,tv_FechaSolucion;
        LinearLayout linearLayout;
        public DetalleIncidencia detalleincidencia;

        public ListaIncidenciasTroncalAdapterViewHolder(View itemView) {
            super(itemView);
            tv_FechaRegistro= (TextView) itemView.findViewById(R.id.tvRegistro);
            tv_Falla= (TextView) itemView.findViewById(R.id.tvFalla);
            tv_Estacion= (TextView) itemView.findViewById(R.id.tvEstacion);
            tv_FechaSolucion= (TextView) itemView.findViewById(R.id.tvSolucion);

            final Context context = itemView.getContext();
            //detalleincidencia=(DetalleIncidencia) itemView.findViewById(R.id.)

            linearLayout=(LinearLayout) itemView.findViewById(R.id.linearItem);

        }

        @Override
        public void onClick(View v) {
            int pos = getAdapterPosition();

            }

        }}

And Finally this is the Entity (Incidencia)

public class Incidencia implements  Parcelable {

    private Integer id_incidencia;
    private String FechaRegistroIncidencia;
    private String NomRegistro;
    private  String FechaRegistro;;
    private String HoraRegistro;
    private int CodEstacion;
    private String NomEstacion;
    private int CodEquipo;
    private String NomEquipo;
    private String TipoFalla;
    private int AtoramientoMoneda;
    private int AtoramientoBillete;
    private String HoraLlegadaEstacion;
    private String Estado;
    private String Observaciones;
    private String FechaSolucion;
    private String HoraSolucion;


    public Integer getId_incidencia() {
        return id_incidencia;
    }

    public void setId_incidencia(Integer id_incidencia) {
        this.id_incidencia = id_incidencia;
    }

    public String getFechaRegistroIncidencia() {
        return FechaRegistroIncidencia;
    }

    public void setFechaRegistroIncidencia(String fechaRegistroIncidencia) {
        FechaRegistroIncidencia = fechaRegistroIncidencia;
    }

    public String getNomRegistro() {
        return NomRegistro;
    }

    public void setNomRegistro(String nomRegistro) {
        NomRegistro = nomRegistro;
    }

    public String getFechaRegistro() {
        return FechaRegistro;
    }

    public void setFechaRegistro(String fechaRegistro) {
        FechaRegistro = fechaRegistro;
    }

    public String getHoraRegistro() {
        return HoraRegistro;
    }

    public void setHoraRegistro(String horaRegistro) {
        HoraRegistro = horaRegistro;
    }

    public Integer getCodEstacion() {
        return CodEstacion;
    }

    public void setCodEstacion(Integer codEstacion) {
        CodEstacion = codEstacion;
    }

    public String getNomEstacion() {
        return NomEstacion;
    }

    public void setNomEstacion(String nomEstacion) {
        NomEstacion = nomEstacion;
    }

    public Integer getCodEquipo() {
        return CodEquipo;
    }

    public void setCodEquipo(Integer codEquipo) {
        CodEquipo = codEquipo;
    }

    public String getNomEquipo() {
        return NomEquipo;
    }

    public void setNomEquipo(String nomEquipo) {
        NomEquipo = nomEquipo;
    }

    public String getTipoFalla() {
        return TipoFalla;
    }

    public void setTipoFalla(String tipoFalla) {
        TipoFalla = tipoFalla;
    }

    public Integer getAtoramientoMoneda() {
        return AtoramientoMoneda;
    }

    public void setAtoramientoMoneda(Integer atoramientoMoneda) {
        AtoramientoMoneda = atoramientoMoneda;
    }

    public Integer getAtoramientoBillete() {
        return AtoramientoBillete;
    }

    public void setAtoramientoBillete(Integer atoramientoBillete) {
        AtoramientoBillete = atoramientoBillete;
    }

    public String getHoraLlegadaEstacion() {
        return HoraLlegadaEstacion;
    }

    public void setHoraLlegadaEstacion(String horaLlegadaEstacion) {
        HoraLlegadaEstacion = horaLlegadaEstacion;
    }

    public String getEstado() {
        return Estado;
    }

    public void setEstado(String estado) {
        Estado = estado;
    }

    public String getObservaciones() {
        return Observaciones;
    }

    public void setObservaciones(String observaciones) {
        Observaciones = observaciones;
    }

    public String getFechaSolucion() {
        return FechaSolucion;
    }

    public void setFechaSolucion(String fechaSolucion) {
        FechaSolucion = fechaSolucion;
    }

    public String getHoraSolucion() {
        return HoraSolucion;
    }

    public void setHoraSolucion(String horaSolucion) {
        HoraSolucion = horaSolucion;
    }


    public Incidencia(){}

    protected Incidencia(Parcel in){
        this.id_incidencia=in.readInt();;
        this.FechaRegistroIncidencia=in.readString();
        this.NomRegistro=in.readString();
        this.FechaRegistro=in.readString();
        this.HoraRegistro=in.readString();
        this.CodEstacion=in.readInt();
        this.NomEstacion=in.readString();
        this.CodEquipo=in.readInt();
        this.NomEquipo=in.readString();
        this.TipoFalla=in.readString();
        this.AtoramientoMoneda=in.readInt();
        this.AtoramientoBillete=in.readInt();
        this.HoraLlegadaEstacion=in.readString();
        this.Estado=in.readString();
        this.Observaciones=in.readString();
        this.FechaSolucion=in.readString();
        this.HoraSolucion=in.readString();
    }

    public static final Parcelable.Creator<Incidencia> CREATOR = new Parcelable.Creator<Incidencia>() {
        @Override
        public Incidencia createFromParcel(Parcel source) {
            return new Incidencia(source);
        }

        @Override
        public Incidencia[] newArray(int size) {
            return new Incidencia[size];
        }
    };


    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.FechaRegistro);
        dest.writeString(this.HoraRegistro);
        dest.writeString(this.TipoFalla);
        dest.writeString(this.FechaSolucion);
        dest.writeString(this.HoraSolucion);
        dest.writeString(this.NomEstacion);

    }

}

Upvotes: 0

Views: 3176

Answers (3)

OneCricketeer
OneCricketeer

Reputation: 191993

You put the parcelable here

IngresoIncidenciaTroncalFragment fragment = new IngresoIncidenciaTroncalFragment();
Bundle args = new Bundle();
args.putParcelable("incident", incidencia);

But within IngresoIncidenciaTroncalFragment, you never got them.

Also, be sure to check the nullability of the arguments.

Bundle args = getArguments();
if (args != null) {
    Incidencia incidencia = args.getParcelable("incident");
} else {
    Log.w("GetIncidencia", "Arguments expected, but missing");
}

Also, you are missing many fields from writeToParcel that are being read into Incidencia(Parcel in), the first of which do not match, and the rest are out of order.

If you want to pass data between Fragments, see

Upvotes: 1

VinayagaSundar
VinayagaSundar

Reputation: 1701

Try the update the Fragment like this

public class IngresoIncidenciaTroncalFragment extends Fragment implements
        FechaDialog.DatePickerDialogFragmentEvents,HoraDialog.TimePickerDialogFragmentEvents ,FechaLlegadaDialog.DateLlegadaPickerDialogFragmentEvents{

    private TextView mDateDisplay;
    private TextView mTimeDisplay;
    private Button botonAgregaIncidencia;
    Context context;
    private OnButtonClickedListener mListener;
    private Spinner spinnerFallas;



    public interface OnButtonClickedListener {
        void onButtonClicked(Incidencia incidencia);
    }


    @Override
    public void onAttach(Context context) {
        if (context instanceOf OnButtonClickedListener) {
            mListener = (OnButtonClickedListener) context;
        }
    }


    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        /**
         *Inflate ingresoincidenciastroncal and setup Views.
         */
            final View x =  inflater.inflate(R.layout.ingresoincidenciastroncal,null);
        context = x.getContext();

        mHoraLLegadaEstacion=(TextView)x.findViewById(R.id.tvHoraLLegadaEstacion);
        mObservaciones=(TextView)x.findViewById(R.id.tvObservaciones);
        mFechaSolucion=(TextView)x.findViewById(R.id.tvFechaSolucion);
        mHoraSolucion=(TextView)x.findViewById(R.id.tvHoraSolucion);


        //ADD ENTITY BUTTON
        botonAgregaIncidencia=(Button) x.findViewById(R.id.btnAgregarIncidencia);
        botonAgregaIncidencia.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {   
                //CREATING NEW ENTITY(Incidencia) 
                Incidencia incidencia = new Incidencia();
                incidencia.setFechaRegistro(mDateDisplay.toString());
                incidencia.setHoraSolucion(mTimeDisplay.toString());
                incidencia.setTipoFalla(spinnerFallas.getPrompt().toString());

                //NEW ENTITY AS PAREMETER
                if (mListener != null) {
                     mListener.onButtonClicked(incidencia);
                }

            }
        });




            return x;

    }

}

Upvotes: 0

tapchicoma
tapchicoma

Reputation: 407

If both fragments in one Activity you just can use FragmentManager#findFragmentByTag(String) or FragmentManager#findFragmentById(int id) to get other fragment instance and just call some public method on that fragment to set entity.

Note that you should use either some tag or some container id when adding this fragments in order to be able to get them.

Upvotes: 1

Related Questions