【问题标题】:Android - How to get latitude and longitude values from outside OnMapReady function?Android - 如何从 OnMapReady 函数外部获取纬度和经度值?
【发布时间】:2017-03-04 02:30:48
【问题描述】:

我有这个 EventActivity 我有一个带有标记的地图:

public class EventActivity extends AppCompatActivity implements OnMapReadyCallback {

private double latitude;
private double longitude;
private GoogleMap eventMap;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event);

        // Declares map fragment.
        SupportMapFragment eventMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.activity_event_map);
        eventMapFragment.getMapAsync(this);

        // Gets latitude and longitude values from database.

            // (things happen here and I get the values correctly)

            latitude = 12.4567785
            longitude = 25.7773665
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        eventMap = googleMap;

        // Sets map position.
        LatLng position = new LatLng(latitude, longitude);
        eventMap.addMarker(new MarkerOptions().position(position));
        eventMap.moveCamera(CameraUpdateFactory.newLatLng(position));
    }

}
  • OnCreate() 上,我正确获得了双精度值对。我什至可以敬酒,它会向他们展示。

  • 问题是,当我想将它们设置为我的地图标记在 OnMapReady() 上的位置时,它什么也得不到或 null

如何正确地将值从 OnCreate() 传递到 OnMapReady()?

编辑:我使用 Firebase 作为我的数据库。

【问题讨论】:

    标签: android google-maps firebase google-maps-markers


    【解决方案1】:

    也许在分配纬度/经度值后初始化地图片段:

    public class EventActivity extends AppCompatActivity implements   OnMapReadyCallback {
    
    private double latitude;
    private double longitude;
    private GoogleMap eventMap;
    
    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_event);
    
        // Gets latitude and longitude values from database.
    
            // (things happen here and I get the values correctly)
    
            latitude = 12.4567785
            longitude = 25.7773665
    
        // Declares map fragment.
        SupportMapFragment eventMapFragment = (SupportMapFragment)  getSupportFragmentManager().findFragmentById(R.id.activity_event_map);
        eventMapFragment.getMapAsync(this);
    
    }
    
    @Override
    public void onMapReady(GoogleMap googleMap) {
        eventMap = googleMap;
    
        // Sets map position.
        LatLng position = new LatLng(latitude, longitude);
        eventMap.addMarker(new MarkerOptions().position(position));
        eventMap.moveCamera(CameraUpdateFactory.newLatLng(position));
    }
    

    }

    【讨论】:

    • 谢谢,但仍然无法正常工作,先生:(我想知道这是否是正常行为...我认为某种解决方案可能是编辑 OnMapReady 超级方法,但我做不到也没有……所以我被困在这里了。
    • 如果您使用的变量具有在 onCreate 中分配的整个活动的范围,它们应该已经可以在 onMapReady 中访问。也许还可以尝试删除 eventMap 变量并直接访问 googleMap 参数。
    【解决方案2】:

    我需要解决一个类似的问题,并且目前在我的应用程序中可以使用此解决方案。我想从我的位置添加一条新的折线到有问题的标记,所以希望 setOnMarkerListener 能够访问我的位置。以下是我的解决方法:

    第 1 步。 我创建了两个全局双打如下:

    private Double myLatitude = -33.865143;
    private Double myLongitude = 151.209900;
    

    我给他们一个默认值 Sydney 以避免任何 NullPointerException 错误,因为我正在将折线添加到折线数组中。 第2步。 在我的 onLocationChanged 方法中,我更新了值:

     @Override
    public void onLocationChanged(Location location) {
        myLatitude = location.getLatitude();
        myLongitude = location.getLongitude();
    ....
    

    现在在第 3 步中,我想创建一个从 mylocation 到所选标记的新行,因此使用了以下代码:

     mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() {
                @Override
                public boolean onMarkerClick(Marker marker) {
                    marker.showInfoWindow();
                    areaText.setText(marker.getTitle());
                    distanceText.setText("0 Meters");
                    markerLatitude = marker.getPosition().latitude;
                    markerLongitude = marker.getPosition().longitude;
    
                    lines.add(mMap.addPolyline(new PolylineOptions()
                            .add(new LatLng(myLatitude, myLongitude),
                                    new LatLng(marker.getPosition().latitude, marker.getPosition().longitude))
                            .width(10)
                            .color(Color.RED)));
                    if (lines.size() > 1)
                        lines.remove((lines.size()-1));
                    return true;
                }
    
    
            });
    

    希望这可以帮助遇到同样问题的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多