简体   繁体   中英

Pass data from Activity to SupportMapFragment

I have two fragments and one activity. DataFragment passes info succesfuly to MainActivity and that's why there is no point providing you the code of it. My issue is , that bundle isn't effective on MyMapFragment which extends SupportMapFragment when I am trying to pass data from MainActivity . Of course I've searched a lot for many days but the only solutions given are for a fragment and not for SupportMapFragment which I think it's different.

MainActivity

package com.manuelpap.mapapp;

import android.app.Fragment;
import android.content.Intent;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.os.Handler;

import com.google.android.gms.maps.SupportMapFragment;
import com.parse.Parse;

public class MainActivity extends AppCompatActivity {
    public String mapLocation="EMPTY";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
        viewPager.setAdapter(new MyAdapter(getSupportFragmentManager()));




        Intent intent = getIntent();
        if (getIntent().getExtras() != null) {
            mapLocation = intent.getExtras().getString("mapLocation");



            Bundle bundle=new Bundle();
            bundle.putString("message", "From Activity");
            MyMapFragment fragobj=new MyMapFragment();
            fragobj.setArguments(bundle);


            Log.d("MAPLOCATION", "----MainActivity---- " + mapLocation);

            finish(); //I am using this because on DataFragment it's starting again , so I don't need multiple instances of MainActivity

        }

    }



    public class MyAdapter extends FragmentPagerAdapter{


        public MyAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public android.support.v4.app.Fragment getItem(int i){
            if(i==0){

                return new DataFragment();

            }
            else {

                return new MyMapFragment();

            }

        }


        @Override
        public int getCount(){
            return 2; //posa scrolls dexia (pages) theloume

        }

        @Override
        public CharSequence getPageTitle(int position) {
            if(position==0){
                return "DATA";
            }
            else {
                return "MAP";

            }
        }
    }


}

MyMapFragment

package com.manuelpap.mapapp;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.os.Handler;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.BitmapDescriptor;
import com.google.android.gms.maps.model.BitmapDescriptorFactory;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MyMapFragment extends SupportMapFragment { //kanei extend thn hdh uparxousa class gia to maps ths google alla den mpoorume na thn doume giati einai kleidomenh
    public String location="EMPTY";


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);



        final Handler handler=new Handler();
        handler.post(new Runnable() {

            @Override
            public void run() {



                if (getArguments() == null) 
                    location = "------NOTHING RECIEVED------";
                else
                    location =getArguments().getString("message"); 


               Log.d("MAPFRAGMENTLOCATION", location);



                handler.postDelayed(this, 200); // set time here to refresh textView

            }

        });



        GoogleMap googleMap = getMap();

        googleMap.setMyLocationEnabled(true);

        googleMap.getUiSettings().setZoomControlsEnabled(true);


        MarkerOptions markerOptions = new MarkerOptions();
        markerOptions.position(new LatLng(40.416775, -3.70379));



        googleMap.addMarker(markerOptions);


    }



}

It looks like you are finishing your main activity

//I am using this because on DataFragment it's starting again , so I don't need multiple instances of MainActivity

Your DataFragment is in the viewpager so it is supposed to start along with your map fragment. You are not starting multiple instances of main activity that I can see here. When you call finish() on your main activity that means that the map and pager and everything goes away. Not sure what exactly your looking for but I assume you are trying to pass the location string to the map so I have tailored my answer to fit that use case. gl and happy coding.

The problem is that you are using new MyMapFragment() without the bundle in the view pager. The other logic that you have in MainActivity pertaining to the Map fragment is not going anything to the one that is displayed with the view pager. Essentially you are just creating another instance of the map fragment that is not displayed anywhere. The view pager is the class that needs the data passed to it.

I thought this link might be helpful here to explain the newInstance Method. Creating a Fragment: constructor vs newInstance()

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ViewPager viewPager = (ViewPager) findViewById(R.id.pager);
    if (getIntent().getExtras() != null) {
        mapLocation = intent.getExtras().getString("mapLocation");
    }

    viewPager.setAdapter(new MyAdapter(getSupportFragmentManager(), mapLocation));

}



public class MyAdapter extends FragmentPagerAdapter{

    private String mMapLocation;

    public MyAdapter(FragmentManager fm, String mapLocation) {
        super(fm);
        mMapLoaction = mapLocation;
    }

    @Override
    public android.support.v4.app.Fragment getItem(int i){
        if(i==0){

            return new DataFragment();

        }
        else {

            Bundle bndl = new Bundle();
            if(!TextUtils.isEmpty(mapLocation))
                bndl.putString("message", mapLocation);
            return new MyMapFragment.newInstance(bndl);

        }

    }

public class MyMapFragment extends SupportMapFragment { //kanei extend thn hdh uparxousa class gia to maps ths google alla den mpoorume na thn doume giati einai kleidomenh
public String location="EMPTY";

public static MyMapFragment newInstance(Bundle bundle) {
    MyMapFragment myMapFragment= new MyMapFragment ();

    if (bundle != null) {
        myMapFragment.setArguments(bundle);
    }

    return myMapFragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    if(getArguments()!=null)
    location =getArguments().getString("message"); 
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM