【问题标题】:Pass data from Activity to SupportMapFragment将数据从 Activity 传递到 SupportMapFragment
【发布时间】:2015-12-11 19:11:36
【问题描述】:

我有两个片段和一个活动。 DataFragment 将信息成功传递给 MainActivity,这就是为什么没有必要为您提供它的代码。我的问题是,当我尝试从MainActivity 传递数据时,bundle 对扩展SupportMapFragmentMyMapFragment 无效。当然,我已经搜索了很多天,但给出的唯一解决方案是针对片段而不是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);


    }



}

【问题讨论】:

  • 如果你应用片段逻辑来支持片段,它应该可以工作。你有没有尝试过任何方法?

标签: java android google-maps android-fragments


【解决方案1】:

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

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

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

问题是您在视图寻呼机中使用没有捆绑包的 new 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"); 
}

【讨论】:

  • 我正在使用finish(),因为在DataFragment 中,当用户按下按钮时,它必须将特定数据发送到MainActivity,然后再发送到MyMapFragment 因为我不熟悉newInstance,所以您的代码似乎有错误,或者我错过了它说 cannot resolve symbol newinstance 的内容
  • 在使用了您回答中的某些部分后,我终于成功了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-12
  • 1970-01-01
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2017-04-05
相关资源
最近更新 更多