Android 在恢复片段时,我无法在地图中的某个位置查看标记和动画摄影机

Android 在恢复片段时,我无法在地图中的某个位置查看标记和动画摄影机,android,android-fragments,android-maps-v2,Android,Android Fragments,Android Maps V2,我正在使用google maps-v2开发一个应用程序。一切都很好,但当我从一个贴图片段转到另一个片段,回到贴图片段时,它没有添加任何标记或设置相机动画 以下是片段的代码: public class MapPane extends Fragment implements DirectionFinderListener { private static final int PERMISSION_REQUEST_CODE = 1; ProgressBar progressBar; // Googl

我正在使用google maps-v2开发一个应用程序。一切都很好,但当我从一个贴图片段转到另一个片段,回到贴图片段时,它没有添加任何标记或设置相机动画

以下是片段的代码:

public class MapPane extends Fragment implements DirectionFinderListener {

private static final int PERMISSION_REQUEST_CODE = 1;
ProgressBar progressBar;
// Google Map
private static GoogleMap googleMap;
public static double latitude, longitude;
private Button btnFindPath;
private String sOrigin = "";
private String sDestination = "";
private List<Marker> originMarkers = new ArrayList<>();
private List<Marker> destinationMarkers = new ArrayList<>();
private List<Polyline> polylinePaths = new ArrayList<>();
private ProgressDialog progressDialog;
View v;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO Add your menu entries here
    super.onCreateOptionsMenu(menu, inflater);
    inflater.inflate(R.menu.map_pane, menu);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    if (id == R.id.m_directions) {

        Fragment frag3 = new DirectionActivity();
        android.support.v4.app.FragmentTransaction ft3 = getActivity().getSupportFragmentManager().beginTransaction();
        ft3.replace(R.id.content_frame, frag3);
        ft3.commit();
    }
    return super.onOptionsItemSelected(item);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    Log.e("MapPane", "onCreateView()");
    v = inflater.inflate(R.layout.activity_maps, container, false);

    progressBar = (ProgressBar) v.findViewById(R.id.progressBar);
    sOrigin = getArguments().getString("source");

    sDestination = getArguments().getString("destination");
    Log.e("MapPane ", "Source: " + sOrigin + "Destination: " + sDestination);

    Geocoder geocoder = new Geocoder(getActivity());
    List<Address> addresses = null;
    if (sOrigin.equals(null)) {
        Toast.makeText(getActivity(), "Source is empty!", Toast.LENGTH_SHORT).show();
    } else {
        try {
            addresses = geocoder.getFromLocationName(sOrigin, 1);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (addresses.size() > 0) {
            latitude = addresses.get(0).getLatitude();
            longitude = addresses.get(0).getLongitude();
            Log.e("Location Coordinates ", String.valueOf(latitude) + " ," + String.valueOf(longitude));
        }
    }

    btnFindPath = (Button) v.findViewById(R.id.btnFindPath);
    progressDialog = new ProgressDialog(v.getContext());
    progressDialog.setCancelable(false);
    progressDialog.setMessage("Please wait...");
    progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    try {
        // Loading map
        initilizeMap();

    } catch (Exception e) {
        e.printStackTrace();
    }

    if (!checkPermission()) {

        requestPermission();

    } else {

        zoomToOrigin();
    }


    btnFindPath.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            sendRequest();
        }
    });


    return v;
}

private void zoomToOrigin() {

    if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        googleMap.setMyLocationEnabled(true);
    } else {
        // Show rationale and request permission.

    }

    googleMap.getUiSettings().setMyLocationButtonEnabled(true);

    googleMap.getUiSettings().setZoomControlsEnabled(true);

    CameraPosition cameraPosition = new CameraPosition.Builder().target(
            new LatLng(latitude, longitude)).zoom(12).build();

    googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}

private boolean checkPermission() {
    int result = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION);
    if (result == PackageManager.PERMISSION_GRANTED) {

        return true;

    } else {

        return false;

    }
}

private void requestPermission() {

    ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, PERMISSION_REQUEST_CODE);

}

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case PERMISSION_REQUEST_CODE:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Toast.makeText(getActivity(), "Permission Granted, Now you can access location data.", Toast.LENGTH_LONG).show();

            } else {

                Toast.makeText(getActivity(), "Permission Granted, Now you can access location data.", Toast.LENGTH_LONG).show();

            }
            break;


    }
}

/**
 * function to load map. If map is not created it will create it for you
 */
private void initilizeMap() {
    if (googleMap == null) {
        googleMap = ((MapFragment) getActivity().getFragmentManager().findFragmentById(
                R.id.map)).getMap();

        // check if map is created successfully or not
        if (googleMap == null) {
            Toast.makeText(getContext(),
                    "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                    .show();
        }
    }
}

private void sendRequest() {


    try {
        new DirectionFinder(this, sOrigin, sDestination).execute();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

@Override
public void onResume() {
    initilizeMap();
    Log.e("MapPane", "onResume()" + latitude + " ," + longitude);

    MarkerOptions marker = new MarkerOptions().position(new LatLng(latitude, longitude))
            .title("Nagpur");

    googleMap.addMarker(marker);
    CameraPosition cameraPosition = new CameraPosition.Builder()
            .target(new LatLng(latitude, longitude)).zoom(14).build();

    googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

    getView().setFocusableInTouchMode(true);
    getView().requestFocus();
    getView().setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
                Fragment fragment = new BDashboard();
                FragmentManager fm = getActivity().getSupportFragmentManager();
                android.support.v4.app.FragmentTransaction ft = fm.beginTransaction();
                ft.replace(R.id.content_frame, fragment);
                ft.commit();
                return true;
            }
            return false;
        }
    });
    super.onResume();
}

@Override
public void onDestroyView() {
    Log.e("MapPane", "onDestroyView");
    try {
        MapFragment fragment = ((MapFragment) getActivity().getFragmentManager().findFragmentById(R.id.map));
        FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
        ft.remove(fragment);
        ft.commit();
    } catch (Exception e) {
    }
    super.onDestroyView();
}

@Override
public void onDirectionFinderStart() {
    progressDialog = ProgressDialog.show(getActivity(), "Please wait.",
            "Finding direction..!", true);

    if (originMarkers != null) {
        for (Marker marker : originMarkers) {
            marker.remove();
        }
    }

    if (destinationMarkers != null) {
        for (Marker marker : destinationMarkers) {
            marker.remove();
        }
    }

    if (polylinePaths != null) {
        for (Polyline polyline : polylinePaths) {
            polyline.remove();
        }
    }
}

@Override
public void onDirectionFinderSuccess(List<Route> routes) {
    progressDialog.dismiss();
    polylinePaths = new ArrayList<>();
    originMarkers = new ArrayList<>();
    destinationMarkers = new ArrayList<>();

    for (Route route : routes) {

        ((TextView) v.findViewById(R.id.tvDuration)).setText(route.duration.text);
        ((TextView) v.findViewById(R.id.tvDistance)).setText(route.distance.text);

        originMarkers.add(googleMap.addMarker(new MarkerOptions()
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.start_blue))
                .title(route.startAddress)
                .position(route.startLocation)));


        destinationMarkers.add(googleMap.addMarker(new MarkerOptions()
                .icon(BitmapDescriptorFactory.fromResource(R.drawable.end_green))
                .title(route.endAddress)
                .position(route.endLocation)));

        PolylineOptions polylineOptions = new PolylineOptions().
                geodesic(true).
                color(Color.BLUE).
                width(10);

        for (int i = 0; i < route.points.size(); i++)
            polylineOptions.add(route.points.get(i));

        polylinePaths.add(googleMap.addPolyline(polylineOptions));
    }

}

}
公共类映射窗格扩展片段实现DirectionFinderListener{
私有静态最终int权限\请求\代码=1;
ProgressBar ProgressBar;
//谷歌地图
私有静态谷歌地图;
公共静态双纬度、经度;
专用按钮btnFindPath;
私有字符串sOrigin=“”;
私有字符串sDestination=“”;
private List originMarkers=new ArrayList();
private List destinationMarkers=new ArrayList();
私有列表polylinepath=new ArrayList();
私有进程对话;
观点五;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
设置选项菜单(真);
}
@凌驾
创建选项菜单(菜单菜单,菜单充气机){
//TODO在此处添加菜单项
super.onCreateOptions菜单(菜单,充气机);
充气器。充气(右菜单。地图窗格,菜单);
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==R.id.m_方向){
片段frag3=新方向活动();
android.support.v4.app.FragmentTransaction ft3=getActivity().getSupportFragmentManager().beginTransaction();
ft3.更换(R.id.content_框架,frag3);
ft3.commit();
}
返回super.onOptionsItemSelected(项目);
}
@可空
@凌驾
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
Log.e(“MapPane”、“onCreateView()”);
v=充气机。充气(R.layout.activity\u地图,容器,假);
progressBar=(progressBar)v.findViewById(R.id.progressBar);
sOrigin=getArguments().getString(“源”);
sDestination=getArguments().getString(“目标”);
Log.e(“地图窗格”,“源:+sOrigin+”目的:+sDestination”);
Geocoder Geocoder=新的地理编码器(getActivity());
列表地址=空;
if(sOrigin.equals(null)){
Toast.makeText(getActivity(),“源为空!”,Toast.LENGTH_SHORT.show();
}否则{
试一试{
地址=geocoder.getFromLocationName(sOrigin,1);
}捕获(IOE异常){
e、 printStackTrace();
}
如果(地址.size()>0){
纬度=地址。get(0)。getLatitude();
经度=地址。获取(0)。获取经度();
Log.e(“位置坐标”,String.valueOf(纬度)+”,“String.valueOf(经度));
}
}
btnFindPath=(按钮)v.findviewbyd(R.id.btnFindPath);
progressDialog=新建progressDialog(v.getContext());
progressDialog.setCancelable(假);
progressDialog.setMessage(“请稍候…”);
progressDialog.setProgressStyle(progressDialog.STYLE_水平);
试一试{
//装载图
initilizeMap();
}捕获(例外e){
e、 printStackTrace();
}
如果(!checkPermission()){
requestPermission();
}否则{
zoomToOrigin();
}
btnFindPath.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
sendRequest();
}
});
返回v;
}
私有void zoomToOrigin(){
if(ContextCompat.checkSelfPermission(getActivity()、Manifest.permission.ACCESS\u FINE\u位置)
==PackageManager.权限(已授予){
googleMap.setMyLocationEnabled(true);
}否则{
//说明理由并请求许可。
}
googleMap.getUiSettings().setMyLocationButtonEnabled(true);
googleMap.getUiSettings().setZoomControlsEnabled(true);
CameraPosition CameraPosition=新建CameraPosition.Builder().target(
新LatLng(纬度、经度)).zoom(12.build();
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
}
私有布尔检查权限(){
int result=ContextCompat.checkSelfPermission(getActivity(),Manifest.permission.ACCESS\u FINE\u LOCATION);
如果(结果==已授予PackageManager.PERMISSION){
返回true;
}否则{
返回false;
}
}
私有void requestPermission(){
ActivityCompat.requestPermissions(getActivity(),新字符串[]{Manifest.permission.ACCESS\u FINE\u LOCATION},permission\u REQUEST\u CODE);
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,字符串权限[],int[]grantResults){
开关(请求代码){
案例权限\请求\代码:
if(grantResults.length>0&&grantResults[0]==PackageManager.PERMISSION\u已授予){
Toast.makeText(getActivity(),“已授予权限,现在您可以访问位置数据了。”,Toast.LENGTH_LONG).show();
}否则{
Toast.makeText(getActivity(),“已授予权限,现在您可以访问位置数据了。”,Toast.LENGTH_LONG).show();
}
打破
}
}
/**
*函数加载映射。如果未创建映射,它将为您创建映射
*/
私有void initilizeMap(){
if(googleMap==null){
googleMap=((MapFragment)getActivity().getFragmentManager().findFragmentById(
R.id.map)).getMap();
//检查是否成功创建映射
if(googleMap==null){
Toast.makeText(getContext(),
“抱歉!无法创建地图”,Toast.LENGTH\u SHORT)
.show();
}
}
}
私有void sendRequest(){
试一试{
新的DirectionFinder(this,sOrigin,sdestinition).execute();
}捕获(不支持的编码异常e){
e、 printStackTrace();
}
}
@凌驾
恢复时公开作废(){
initilizeMap();
Log.e(“MapPane”、“onResume()”+纬度+”、“+经度”);
标记选项标记