如何将Object从一个片段传递给另一个片段

时间:2017-06-09 16:17:18

标签: android object android-fragments android-recyclerview

我想传递我在One片段中创建的整个实体(Incidencia)并将其传递给另一个片段,该片段将显示之前添加的每个实体的列表。两个片段都在一个Activity内。我使用recyclerview列出实体,这个实体实现了parcelable。

这是包含两个片段的主要活动

    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);
    }
}

这是将添加实体的片段

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;

    }

}

这是将显示实体列表的片段

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;
    }
}

这是recyclerview适配器

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();

            }

        }}

最后这是实体(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);

    }

}

3 个答案:

答案 0 :(得分:1)

如果一个Activity中的两个片段都可以使用FragmentManager#findFragmentByTag(String)FragmentManager#findFragmentById(int id)来获取其他片段实例,只需在该片段上调用一些公共方法来设置实体。

请注意,在添加此片段时,您应该使用某个标记或某个容器ID,以便能够获取它们。

答案 1 :(得分:1)

你把parcelable放在这里

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

但在IngresoIncidenciaTroncalFragment内,你从来没有得过它们。

另外,请务必检查参数的可为空性。

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

此外,您遗漏了writeToParcel中被读入Incidencia(Parcel in)的许多字段,其中第一个字段不匹配,其余字段无序。

如果要在片段之间传递数据,请参阅

答案 2 :(得分:0)

尝试像这样更新片段

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;

    }

}