如何在片段中放置谷歌地图功能

时间:2014-03-04 03:14:53

标签: android google-maps layout android-fragments

嗯,下面是我的例子,我在Android中有一个主要活动,我已经创建了一个工具栏,并且有一个名为location的子函数,我将在这里调用一些位置函数。 它是在片段中编码的,因为我在单击工具栏中的图标后进入子函数时需要创建一个片段。

我有如何在活动中显示谷歌地图。但是我没有在片段中显示它。 我能做的就是在片段内调用onActivityCreated。但是,虽然程序工作正常,但布局会省略工具栏。(我不擅长英语,如果你不明白我在说什么,请问我详细说明:))

那么有没有人可以帮我弄清楚如何调用一些谷歌定位服务,如找到png和lat,或在片段中显示谷歌地图?我的片段代码如下:

LocationFragment.java:

public class LocationFragment extends MapFragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View location_layout = inflater.inflate(R.layout.location_layout, container, false);
        return location_layout;
    }
}

1 个答案:

答案 0 :(得分:1)

您的片段类将是:

public class MyFragment extends Fragment {

    private MapView mapView;
    private GoogleMap map;
    private Bundle bundle;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       View v = inflater.inflate(R.layout.fragment_map, container, false);

       // initialize it to avoid a NPE
       try {
           MapsInitializer.initialize(getActivity());
       } catch (GooglePlayServicesNotAvailableException e) { }

       mapView = (MapView) v.findViewById(R.id.map);
       mapView.onCreate(bundle);

       // check if the map is null
       if (map == null) {
           map = ((MapView) v.findViewById(R.id.map)).getMap();
       }

       // add a marker
       map.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Here!"));

       return v;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bundle = savedInstanceState;
    }

    @Override
    public void onResume() {
       super.onResume();
       mapView.onResume();
    }

    @Override
    public void onPause() {
       super.onPause();
       mapView.onPause();
    }

    @Override
    public void onDestroy() {
       mapView.onDestroy();
       super.onDestroy();
    }

    @Override  
    public void onLowMemory() {  
        super.onLowMemory();  
        mapView.onLowMemory();  
    }  
}

最后,您的布局 fragment_map

<com.google.android.gms.maps.MapView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/map"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />  

他'我们去在片段中显示您的地图!其中包含 a little post ,Google上有 the reference

对于用户的位置,需要进行一些阅读,只是为了了解更多信息: Location Strategies (仔细阅读,一切都告诉那里)。您需要Location ManagerLocation Listener 首先,你需要这个工具:

// The implement
implements LocationListener { [...] }  

通过此监听器,您可以通过GPS或网络获取和更新设备的位置。不要忘记测试设备服务的状态,如下所示:

// Getting Google Play availability status
int status = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());  

以下代码是获取片段内当前位置的示例:

public class LocationFragment extends Fragment implements LocationListener {

    private Marker marker;
    private LocationManager locationManager;

    static final LatLng NEWYORK = new LatLng(40.75, -74.03);

    @Override  
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {  
        super.onCreateView(inflater, container, savedInstanceState);
        View v = inflater.inflate(R.layout.location_layout, container, false);

        // ... 
        if (map == null) {
            map = ((MapView) v.findViewById(R.id.map)).getMap();
        }
        // ...
        if (map != null) initMap();

        locationManager = (LocationManager) getActivity().getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
        if(locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            getGPS();
        } else {
            locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 10, this);    
        }
        // ...

        return v;
    }

    @Override
    public void onResume() {
        super.onResume();
        getGPS();
    }

    @Override
    public void onPause() {
        super.onPause();
        outGPS();
    }

    public void getGPS() {
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10, this);
    }

    public void outGPS() {
        locationManager.removeUpdates(this);
    }

    @Override
    public void onLocationChanged(final Location location) {
        // get the latitude and the longitude
        final StringBuilder msg = new StringBuilder("lat : ");
        msg.append(location.getLatitude());
        msg.append( "; lng : ");
        msg.append(location.getLongitude());
        // display it on a toast
        Toast.makeText(getActivity().getApplicationContext(), msg.toString(), Toast.LENGTH_SHORT).show();

        // final latlng with these above to update the position on a marker
        final LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
        gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 1));
        marker.setPosition(latLng);
        // ...
    }

    @Override
    public void onProviderDisabled(final String provider) {
        if("gps".equals(provider)) {
            desabonnementGPS();
        }
    }

    @Override
    public void onProviderEnabled(final String provider) {
        if("gps".equals(provider)) {
            abonnementGPS();
        }
    }

    @Override
    public void onStatusChanged(final String provider, final int status, final Bundle extras) { }

    private void initMap() {
        gMap.addMarker(new MarkerOptions().title("New-York").position(NEWYORK));
        marker = gMap.addMarker(new MarkerOptions().title("I am here!").position(new LatLng(0, 0)));
    }
}

然后,您使用onLocationChanged方法更新当前位置后创建管理器。有一些很好的教程: a tutorial by Vogella (可能有帮助)和 another tutorial (也可以帮助你)。

  

您有很多关于 this blog 的提示。很简单,非常全面。

注2:请勿忘记在您的画面中添加许可。

我希望,我清楚地回答,这将是有用的 快乐的编码!