java - 将数据从 Activity 传递到 SupportMapFragment

标签 java android google-maps android-fragments

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


    }



}

最佳答案

您似乎正在完成主要 Activity

//我使用它是因为在 DataFragment 上它再次启动,所以我不需要 MainActivity 的多个实例

您的 DataFragment 位于 viewpager 中,因此它应该与您的 map fragment 一起启动。您没有启动我在此处看到的主要 Activity 的多个实例。 当您在主要 Activity 上调用 finish() 时,这意味着 map 和寻呼机以及所有内容都会消失。不确定您到底在寻找什么,但我假设您正在尝试将位置字符串传递到 map ,因此我定制了答案以适应该用例。

问题是您正在使用 new MyMapFragment() ,而 View 寻呼机中没有 bundle 。 MainActivity 中与 Map fragment 相关的其他逻辑与 View 分页器显示的逻辑没有任何关系。本质上,您只是创建未在任何地方显示的 map fragment 的另一个实例。 View 分页器是需要传递给它的数据的类。

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

关于java - 将数据从 Activity 传递到 SupportMapFragment,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34230861/

相关文章:

基于 Android 的 SMS 服务器和 WakeLock?

java - 尝试从 ID3v1 标签读取流派时出现 NullPointerException

google-maps - 如何使用 Javascript 和 Subgurim Maps 设置 map 的中心

java - 用 Java 构建 GPS 跟踪应用程序

java - hibernate/"absolutely necessary with bi-directional links"?

java - StringBuilder逆向方法的时间复杂度

java - 我应该为 Socket 上的每个读/写创建一个新线程吗?

java - 为什么继承抽象类时执行结果不符合预期

android - 不同设备的授权失败(Android Google Map API v2)

android - 在 Oreo 中禁用状态栏拉取