将数据从活动传递到片段(空getArguments())

时间:2019-05-29 15:06:10

标签: android fragment

我需要将数据从activity传递到fragment。 我确实尝试设置setArguments()broadcast receiver 而且我不知道我在哪里犯错 提示1:MainActivity setArguments() bundle中塞满了东西,但是当我打电话给getArguments()时却是空的,为什么?

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 :(得分:0)

您可能做错了什么,就是在片段本身中执行片段事务。传统上,交易应在父活动中进行。尝试通过将事务逻辑从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"));
        }
}