Fragment中的Android MapView Map V2

时间:2015-02-25 22:49:57

标签: java android google-maps android-fragments android-mapview

我一直试图让我的地图工作,我有FragmentTabHost atm只包含3个标签。在我的地图选项卡中,它应该加载谷歌地图片段并放大到用户位置,但它只是加载地图但不执行放大方法。我还修复了如果由于地图ID重复而存在Binrary XML文件时,当我返回到地图选项卡时它会崩溃应用程序。

另一个问题是我可以采用什么方法来异步加载maptab。

public class Maps extends Fragment {

private GoogleMap googleMap;
MapView mapView;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.fragment_maps, container, false);

    mapView = (MapView) view.findViewById(R.id.mapview);
    mapView.onCreate(savedInstanceState);

    // Gets to GoogleMap from the MapView and does initialization stuff
    googleMap = mapView.getMap();
    MapsInitializer.initialize(this.getActivity());
    return view;
}

public void onActivityCreate(Bundle savedInstanceState){
    super.onActivityCreated(savedInstanceState);
    setUpMapIfNeeded();
}

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

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

private void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the map.
    if (googleMap == null) {
        // Try to obtain the map from the SupportMapFragment.
        googleMap = ((SupportMapFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.mapview))
                .getMap();
        // Check if we were successful in obtaining the map.
        if (googleMap != null) {
            executeMap();
        }
    }
}

private void executeMap() {
    googleMap.setMyLocationEnabled(true);
    googleMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));

    //Get location services from Google services and choose the best fit through criteria
    LocationManager locationMan = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
    Criteria bestFit = new Criteria();

    //Get name of best provider
    String provider = locationMan.getBestProvider(bestFit, true);
    //Get Location
    Location myLocation = locationMan.getLastKnownLocation(provider);

    //Get long and lat, create an object marker
    double latitude = myLocation.getLatitude();
    double longitude = myLocation.getLongitude();
    LatLng position = new LatLng(latitude, longitude);

    //Zoom into current location
    googleMap.animateCamera(CameraUpdateFactory.newLatLng(position));
    googleMap.animateCamera(CameraUpdateFactory.zoomTo(18));
    googleMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("You are here"));
}

}

为什么不执行setupmaifneeded();

2 个答案:

答案 0 :(得分:2)

对于first issue:尝试使用以下方法zoom the camera to user's location

private void centerMapOnMyLocation() {

    map.setMyLocationEnabled(true);

    location = map.getMyLocation();

    if (location != null) {
        myLocation = new LatLng(location.getLatitude(),
                location.getLongitude());
    }
    map.animateCamera(CameraUpdateFactory.newLatLngZoom(myLocation,
            Constants.MAP_ZOOM));
} 

对于second issueload the maptab asynchronously是什么意思?您需要read data形成database吗?我的建议是,您可以在应用上添加splashScreen等待片刻,让数据加载。

答案 1 :(得分:0)

应用程序崩溃正在发生,因为您没有使用接口来在片段之间进行通信。现在它们紧密耦合,因此存在内存泄漏。请参阅this指南,了解有关android中片段间通信的更多信息。有关代码实现,请参阅this指南。

希望有所帮助!!