Android 将序列化对象传递给片段

Android 将序列化对象传递给片段,android,android-fragments,Android,Android Fragments,我需要通过几个活动、适配器和片段发送一个对象来加载信息。 使用该信息的对象导航如下所示: 活动A->活动B->片段->适配器->活动 活动A:我发送数据的地方,我已经探测到了,他们直接进入活动B public void actualizarVista(DataBaseDTO dataBaseDTO){ if (dataBaseDTO.getEntidad() != null && dataBaseDTO.getOperacion().equals(EnumOp

我需要通过几个活动、适配器和片段发送一个对象来加载信息。 使用该信息的对象导航如下所示:

活动A->活动B->片段->适配器->活动

活动A:我发送数据的地方,我已经探测到了,他们直接进入活动B

 public void actualizarVista(DataBaseDTO dataBaseDTO){

        if (dataBaseDTO.getEntidad() != null && dataBaseDTO.getOperacion().equals(EnumOperaciones.CONSULTAR_ESTUDIANTE_CEDULA.getOperacion()))
        {
            Intent intent = new Intent();
            intent.setClass(this, MenuActivity.class);

            Estudiante datosest = (Estudiante) dataBaseDTO.getEntidad();

            Bundle bundle = new Bundle();
            bundle.putSerializable("Estudiante", datosest);
            intent.putExtras(bundle);
            startActivity(intent);
            finish();

        }else if (dataBaseDTO.getEntidad() != null && dataBaseDTO.getOperacion().equals(EnumOperaciones.CONSULTAR_PROFESOR_CEDULA.getOperacion())){

            Intent intent = new Intent();
            intent.setClass(this, Menu_profesor.class);

            Profesor datosprof = (Profesor) dataBaseDTO.getEntidad();

            Bundle bundle = new Bundle();
            bundle.putSerializable("Profesor", datosprof);
            intent.putExtras(bundle);
            startActivity(intent);
            finish();

        }else{
            notificar(dataBaseDTO);
        }    
    }
活动B:

 protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_menu);

        setTitle("Profesores disponibles");
        Toolbar toolbar =  findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        Bundle  datos = getIntent().getExtras();
        estu = (Estudiante) datos.getSerializable("Estudiante");

        DrawerLayout drawer =  findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);

        drawer.addDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        View headerView = navigationView.getHeaderView(0);
        nombreNav =  headerView.findViewById(R.id.lbNombreNav);
        correoNav = headerView.findViewById(R.id.navCorreoEst);

        nombreNav.setText(estu.getNombre());
        correoNav.setText(estu.getCorreo());

        Fragment listarProfesorFragment = new ListarProfesorFragment();

        listarProfesorFragment.setArguments(datos);

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.contenidomenuestudiante, new ListarProfesorFragment());
        fragmentTransaction.commit();    
    }
片段:

public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle bundle) {
    View viewListarProfesores = inflater.inflate(R.layout.fragment_menuest_inicial, viewGroup, false);
    listprofesores = viewListarProfesores.findViewById(R.id.listProfesor);

      Bundle data = this.getArguments();
     objetoEstudiante = (Estudiante) data.getSerializable("Estudiante");

     Log.e("ERROR", "" + data);

    return viewListarProfesores;
}
当我访问片段中的数据时,我得到一个错误,数据为空。我不知道做这件事的正确方法


非常感谢您的帮助。

您可以更改方法,
在order bundle中,将其作为参数传递给fragment
在片段的newInstance方法中添加如下参数

public static ListarProfesorFragment newInstance(Estudiante estu){
    ...
    objetoEstudiante = estu;
    // and here you have access to it ;-)
}
在上面的片段中创建newInstance方法,然后在活动中调用它

estu = (Estudiante) datos.getSerializable("Estudiante");
Fragment listarProfesorFragment = ListarProfesorFragment.newInstance(estu);

步骤1:在模型类中实现Serializable 像这样

public class Estudiante implements Serializable{

}
要在片段中实现序列化,您必须这样做

public class BlankFragment extends Fragment {
    private static final String ARG_PARAM1 = "obj";
    private Estudiante object;
    public BlankFragment() {
    }
    public static BlankFragment newInstance(Estudiante param1) {
        BlankFragment fragment = new BlankFragment();
        Bundle args = new Bundle();
        args.putSerializable(ARG_PARAM1, param1);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            object = (Estudiante) getArguments().getSerializable(ARG_PARAM1);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view= inflater.inflate(R.layout.fragment_blank, container, false);
        // Use object
        return view;
    }

}
步骤3:将对象传递给片段时,只需执行以下操作

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.container, BlankFragment.newInstance(new Estudiante()));
        transaction.commit();

您知道一些更有效的方法,不必通过不同的活动片段发送对象,您可以从任何地方访问对象,无论是从活动还是片段。我不明白答案,你能再具体一点吗?谢谢你的回复,我会试试的。我有一个顾虑,我可以通过某种方式创建一个类来保存对象并从应用程序中的任何位置访问它,无论是活动还是片段,使其像公共静态Estudiante对象一样静态;分配它的值,在应用程序中的任何地方,您都可以使用类ref#访问它,如MainActivity.object等