Мне нужно отправить объект через несколько действий, адаптер и фрагмент для загрузки информации. Навигация по объекту с информацией будет такой:

Действие 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);
        }    
    }

Деятельность Б:

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

Когда я обращаюсь к данным во фрагменте, я получаю сообщение об ошибке, данные равны нулю. Я не знаю, как это правильно сделать.

Большое спасибо за вашу помощь.

1
John Vanegas 23 Сен 2018 в 12:15

2 ответа

Лучший ответ

Шаг 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();
2
Intsab Haider 23 Сен 2018 в 09:29

Вы можете изменить свой метод,
в пакете заказа передайте его как параметр фрагменту
в вашем методе 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);
0
Farrokh 23 Сен 2018 в 09:37