设置高德地图在Fragment中显示

tcxingdechen 2014-03-11

官网的教程是在Activity下 在Fragment下在高德论坛找到一些方法 试了下可以显示 但是切换后总会有些问题

比如切换后就是新的了 切换后地图就不显示了

我这种方式可以在切换后保持地图状态 但是得限定屏幕为水平或者竖直 如果翻转的话也会报错

布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <com.amap.api.maps.MapView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/mapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </com.amap.api.maps.MapView>

</RelativeLayout>

代码:

package com.cc.android.map.fragment;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import com.amap.api.maps.AMap;
import com.amap.api.maps.MapView;
import com.cc.android.map.MainActivity;
import com.cc.android.map.R;
import com.cc.android.map.constant.Constants;

public class MapFragment extends Fragment {
	
	private static MapFragment fragment=null;
	public static final int POSITION=0;
	
	private MapView mapView;
	private AMap aMap;
	private View mapLayout;
	
	public static Fragment newInstance(){
		if(fragment==null){
			synchronized(MapFragment.class){
				if(fragment==null){
					fragment=new MapFragment();
				}
			}
		}
		return fragment;
	}
    @Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
    	if (mapLayout == null) {
			Log.i("sys", "MF onCreateView() null");
			mapLayout = inflater.inflate(R.layout.map, null);
			mapView = (MapView) mapLayout.findViewById(R.id.mapView);
			mapView.onCreate(savedInstanceState);
			if (aMap == null) {
				aMap = mapView.getMap();
			}
    	}else {
			if (mapLayout.getParent() != null) {
				((ViewGroup) mapLayout.getParent()).removeView(mapLayout);
			}
		}
		return mapLayout;
	}

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        ((MainActivity) activity).onSectionAttached(Constants.MAP_FRAGMENT);
    }
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
	}

	@Override
	public void onResume() {
		Log.i("sys", "mf onResume");
		super.onResume();
		mapView.onResume();
	}

	/**
	 * 方法必须重写
	 * map的生命周期方法
	 */
	@Override
	public void onPause() {
		Log.i("sys", "mf onPause");
		super.onPause();
		mapView.onPause();
	}

	/**
	 * 方法必须重写
	 * map的生命周期方法
	 */
	@Override
	public void onSaveInstanceState(Bundle outState) {
		Log.i("sys", "mf onSaveInstanceState");
		super.onSaveInstanceState(outState);
		mapView.onSaveInstanceState(outState);
	}

	/**
	 * 方法必须重写
	 * map的生命周期方法
	 */
	@Override
	public void onDestroy() {
		Log.i("sys", "mf onDestroy");
		super.onDestroy();
		mapView.onDestroy();
	}
}

 这样可以保证在切换fragment的时候 地图不会不显示或者还原

注意要在清单中注明app的方向 不能让屏幕翻转

在Activity标签中写:

android:screenOrientation="portrait"

以上的代码出了点问题 就是不要返回一个单例 不然关掉再打开不会加载地图 改正:

public static Fragment getNewInstance(Context context) {
		MapFragment fragment = null;
		fragment = new MapFragment();
		fragment.context=context; //context变为域
		fragment.locationSource = new MyLocationSource(context);
		return fragment;
	}

  

不知道大家有什么方法 让高德地图显示在fragment中 在切换后依然保留原来的状态 翻转屏也不会有异常 欢迎讨论

相关推荐