如何从地图活动中获取选定的位置并将其传递给父活动?

Posted

技术标签:

【中文标题】如何从地图活动中获取选定的位置并将其传递给父活动?【英文标题】:How to get selected location from map activity and pass it to a parent activity? 【发布时间】:2017-04-06 20:45:44 【问题描述】:

对于当前的项目,我需要对经纬度数据做一些事情。

我正在使用 Google 地图 api(不是地图应用)。 创建项目时,我选择使用 Google Maps Activity 模板。 该项目包含一个 MainActivity 和一个 MapsActivity。 (最低 api 19)

我正在寻找一种从用户在地图上触摸的位置获取经度和纬度的方法。

需要在MapsActivity中选择所选位置的经纬度,然后向下传递给MainActivity(用CONSTANTS还是intents?) 最后,当用户选择了位置并且数据传递成功后,用户返回到MainActivity。

如何使用适用于 Android 的 Google Maps API 获取 MapsActivity 上的选定位置,并将该选定位置传递回 MainActivity?

【问题讨论】:

【参考方案1】:

使用startActivityForResult() 打开 MapsActivity,然后使用 Google Map 上的点击监听器让用户选择一个点。

这是一个简单的例子。

首先是 MainActivity,它会在单击按钮时打开 MapsActivity,并显示一个 Toast,其中包含用户在 MapsActivity 中选择的点的纬度/经度:

public class MainActivity extends AppCompatActivity 

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

        Button button = (Button) findViewById(R.id.button_pick_point);
        button.setOnClickListener(new View.OnClickListener() 
            @Override
            public void onClick(View view) 
                pickPointOnMap();
            
        );
    

    static final int PICK_MAP_POINT_REQUEST = 999;  // The request code
    private void pickPointOnMap() 
        Intent pickPointIntent = new Intent(this, MapsActivity.class);
        startActivityForResult(pickPointIntent, PICK_MAP_POINT_REQUEST);
    

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        if (requestCode == PICK_MAP_POINT_REQUEST) 
            // Make sure the request was successful
            if (resultCode == RESULT_OK) 
                LatLng latLng = (LatLng) data.getParcelableExtra("picked_point");
                Toast.makeText(this, "Point Chosen: " + latLng.latitude + " " + latLng.longitude, Toast.LENGTH_LONG).show();
            
        
    


然后是 MapsActivity,它使用 GoogleMap.OnMapClickListener 来获取用户选择的点的纬度/经度,并将数据传回 MainActivity。请注意,LatLng 对象可以作为额外对象传递,因为它实现了 Parcelable 接口。

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback 

    private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    

    @Override
    public void onMapReady(GoogleMap googleMap) 
        mMap = googleMap;
        mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() 
            @Override
            public void onMapClick(LatLng latLng) 
                Intent returnIntent = new Intent();
                returnIntent.putExtra("picked_point",latLng);
                setResult(Activity.RESULT_OK,returnIntent);
                finish();
            
        );
    

【讨论】:

以上是关于如何从地图活动中获取选定的位置并将其传递给父活动?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 GeoFire 中检索持续更新的位置数据并将其放在 Google 地图上?

如何从购物车中的每件商品中获取数量并传递给活动?

获取用户输入的确切位置

从一个活动传递图像另一个活动

如何将变量从 Activity 传递到 Fragment,并将其传回?

如何从“活动”中的“编辑”文本中获取值并将其用于片段?