第二次没有在android地图片段上加载位置和标记

时间:2015-01-13 06:36:29

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

我有一个包含5个标签的活动,每个标签都包含一个片段。 中间选项卡包含一个布局,我可以在其中动态添加地图片段。一切顺利,直到这里。 现在,当我移动到标签1或5并返回到第3个标签时,我的所有标记和当前位置都会从地图中消失!

我试图使用日志找到问题,并且正在调用包括onMapReady()在内的每个方法(我正在添加标记并启用此函数中的当前位置),但地图上没有显示任何内容。处理标记数据并打印日志需要时间。但没有任何表现。所以它更令人费解!

有没有人知道如何解决这个问题?

3 个答案:

答案 0 :(得分:0)

当您希望在本地存储少量数据时,您始终可以使用共享首选项,即使用户在应用程序之间切换,您也不想放弃这些数据。您的情况看起来很相似,因为当您在活动的标签之间切换时,标记会消失。对于当前位置,只要您的地图被实例化,您就可以随时调用onLocationChanged。

用于在共享首选项中存储地图标记...这是一个小代码片段。此代码在按下后退按钮时保存标记的状态..您可以在侦听器中传递相同的方法(SavePreferences())在地图标签加载时更改标签并检索标签。

    public class MapsActivity extends FragmentActivity {

    private GoogleMap mMap; // Might be null if Google Play services APK is not available.
    private List<Marker> markerList;

    public MapsActivity(){
        if(markerList == null){
            markerList = new ArrayList<Marker>();
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);

        setUpMapIfNeeded();

        LoadPreferences();
        Intent intent = getIntent();
        Bundle data = intent.getExtras();
        String label = data.getString("sum");
        int newLatitude = data.getInt("firstNumber");
        int newLongitude = data.getInt("secondNumber");

        MarkerOptions mo = new MarkerOptions().position(new LatLng(newLatitude, newLongitude)).title(label);
        markerList.add(mMap.addMarker(mo));
    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
    }

    @Override
    public void onBackPressed(){
        super.onBackPressed();
        SavePreferences();
    }

    private void SavePreferences(){
        SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();

        editor.putInt("listSize", markerList.size());

        for(int i = 0; i <markerList.size(); i++){
            editor.putFloat("lat"+i, (float) markerList.get(i).getPosition().latitude);
            editor.putFloat("long"+i, (float) markerList.get(i).getPosition().longitude);
            editor.putString("title"+i, markerList.get(i).getTitle());
        }

        editor.commit(); 
    }

    private void LoadPreferences(){
        SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);

        int size = sharedPreferences.getInt("listSize", 0);
        for(int i = 0; i < size; i++){
            double lat = (double) sharedPreferences.getFloat("lat"+i,0);
            double longit = (double) sharedPreferences.getFloat("long"+i,0);
            String title = sharedPreferences.getString("title"+i,"NULL");

            markerList.add(mMap.addMarker(new MarkerOptions().position(new LatLng(lat, longit)).title(title)));
        }
    }
}

希望这会有所帮助!!!

答案 1 :(得分:0)

自从你写这篇文章以来很长一段时间,但在我寻找解决方案时,我今天偶然发现了你的问题。在断开GoogleApiClient之前,我能够为我解决这个问题之后不久,还要删除ConnectionCallbackListener(我的Activity),例如:

googleApiClient.unregisterConnectionCallbacks(this);
googleApiClient.disconnect();

我的流程是这样的: 创建视图时初始化MapView。连接GoogleApiClient。在ConnectionCallbackListener.onConnected()我做我需要的事情,然后取消注册和断开连接。

希望这能帮到你!

答案 2 :(得分:0)

我偶然发现了一个类似的问题,虽然它涉及使用后退按钮结束应用程序 - 而不是杀死它。之后我再次打开应用程序时,标记不会显示,googleMap.animateCamera 会抛出异常,提示 Map size cannot be 0

结果是,我使用了 Fragment 的一个实例,并通过 MainActivityMapFragment.getInstance( this ) 调用它,所以解决方案是在片段的 {{ 1}} 方法。