Передача данных из действия во фрагмент (пустой getArguments ()) - PullRequest
2 голосов
/ 29 мая 2019

Мне нужно передать данные от activity до fragment. Я попробовал установить setArguments(), broadcast receiver и я не знаю, где я делаю ошибку совет 1: в MainActivity setArguments() bundle полно вещей, но когда я звоню getArguments(), там пусто, почему?

РЕДАКТИРОВАТЬ: я просто забыл загрузить его в MainActivity после сохранения intance

MainActivity:

    @Override
    protected void onSaveInstanceState(Bundle outState) {

        Bundle gameData = getIntent().getExtras();

        float current_zoom =(gameData.getFloat("current_zoom"));
        LatLng current_target =((LatLng)gameData.getParcelable("current_target"));
        float current_bearing =(gameData.getFloat("current_bearing"));
        String current_map_mode = (gameData.getString("current_map_mode"));

        Bundle dataActivityBundle = new Bundle();
        dataActivityBundle.putFloat("current_zoom",current_zoom);
        dataActivityBundle.putParcelable("current_target",current_target);
        dataActivityBundle.putFloat("current_bearing",current_bearing);
        dataActivityBundle.putString("current_map_mode",current_map_mode);

        MapFragment myObj = new MapFragment();
        myObj.setArguments(dataActivityBundle);
        Log.i("Rotate","Arguments : "+String.valueOf(mapFragment.getArguments()));


        super.onSaveInstanceState(outState);
    }

MapFragment:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment

       View v = inflater.inflate(R.layout.fragment_map, container, false);

        mapFragment = (SupportMapFragment)getChildFragmentManager().findFragmentById(R.id.map);
        if(mapFragment==null){
            FragmentManager fm = getFragmentManager();
            FragmentTransaction ft = fm.beginTransaction();
            mapFragment = SupportMapFragment.newInstance();
            ft.replace(R.id.map,mapFragment).commit();
        }
        mapFragment.getMapAsync(this);


       if (getArguments() != null) {

            current_zoom = getArguments().getFloat("current_zoom");
            current_target = getArguments().getParcelable("current_target");
            current_bearing = getArguments().getFloat("current_bearing");
            current_map_mode = getArguments().getString("current_map_mode");

            Log.i("Rotate","onCreateView : getArguments() != null");
            Log.i("Rotate","current_zoom "+getArguments().getFloat("current_zoom"));
            Log.i("Rotate","current_target "+getArguments().getParcelable("current_target"));
            Log.i("Rotate","current_bearing "+getArguments().getFloat("current_bearing"));
            Log.i("Rotate","current_map_mode "+getArguments().getString("current_map_mode"));
        }
}

1 Ответ

0 голосов
/ 29 мая 2019

Что-то, что вы делаете неправильно, выполняет транзакцию фрагмента в самом фрагменте. Традиционно транзакция должна происходить в родительской активности. Попробуйте изменить код, переместив логику транзакции с MapFragment на MainActivity следующим образом:

// MainActivity.java
  @Override
    protected void onSaveInstanceState(Bundle outState) {

        Bundle gameData = getIntent().getExtras();

        float current_zoom =(gameData.getFloat("current_zoom"));
        LatLng current_target =((LatLng)gameData.getParcelable("current_target"));
        float current_bearing =(gameData.getFloat("current_bearing"));
        String current_map_mode = (gameData.getString("current_map_mode"));

        Bundle dataActivityBundle = new Bundle();
        dataActivityBundle.putFloat("current_zoom",current_zoom);
        dataActivityBundle.putParcelable("current_target",current_target);
        dataActivityBundle.putFloat("current_bearing",current_bearing);
        dataActivityBundle.putString("current_map_mode",current_map_mode);

        // Fragment transaction code moved here
        MapFragment myObj = new MapFragment();
        myObj.setArguments(dataActivityBundle);
        FragmentManager fm = getFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        mapFragment = SupportMapFragment.newInstance();
        ft.replace(R.id.map,mapFragment).commit();
        Log.i("Rotate","Arguments : "+String.valueOf(mapFragment.getArguments()));


        super.onSaveInstanceState(outState);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View v = inflater.inflate(R.layout.fragment_map, container, false);

        // Fragment transaction logic no longer here

        // Call private functions without initializing the object's own class 
        getMapAsync(this);


       if (getArguments() != null) {

            current_zoom = getArguments().getFloat("current_zoom");
            current_target = getArguments().getParcelable("current_target");
            current_bearing = getArguments().getFloat("current_bearing");
            current_map_mode = getArguments().getString("current_map_mode");

            Log.i("Rotate","onCreateView : getArguments() != null");
            Log.i("Rotate","current_zoom "+getArguments().getFloat("current_zoom"));
            Log.i("Rotate","current_target "+getArguments().getParcelable("current_target"));
            Log.i("Rotate","current_bearing "+getArguments().getFloat("current_bearing"));
            Log.i("Rotate","current_map_mode "+getArguments().getString("current_map_mode"));
        }
}
...