将数据从Activity传递到SupportMapFragment

时间:2015-12-11 19:11:37

标签: java android google-maps android-fragments

我有两个片段和一个活动。 DataFragment将信息成功传递给MainActivity,这就是为什么没有必要为您提供代码的原因。我的问题是bundle在我MyMapFragment尝试传递数据SupportMapFragmentMainActivity无效。当然,我已经搜索了很多天,但是给出的唯一解决方案是片段而不是SupportMapFragment,我认为这是不同的。

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


    }



}

1 个答案:

答案 0 :(得分:1)

看起来你正在完成主要活动

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

您的DataFragment位于viewpager中,因此它应该与您的地图片段一起启动。您没有启动我在此处可以看到的多个主要活动实例。 当您在主活动上调用finish()时,这意味着地图和寻呼机一切都消失了。不确定你究竟在寻找什么,但我假设你正在尝试将位置字符串传递给地图,所以我已经根据这个用例量身定制了我的答案。 gl和快乐的编码。

问题是你在视图寻呼机中没有使用新的MyMapFragment()。您在MainActivity中与Map片段相关的其他逻辑与视图寻呼机显示的逻辑无关。实际上,您只是创建了一个未在任何地方显示的地图片段的另一个实例。视图分页器是需要传递给它的数据的类。

我认为此链接可能有助于解释newInstance方法。 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"); 
}