首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带碎片的Android mapview不能添加两次吗?

带碎片的Android mapview不能添加两次吗?
EN

Stack Overflow用户
提问于 2011-10-19 16:25:34
回答 5查看 5.6K关注 0票数 12

我正在使用android兼容类,通过hack在这里找到的片段中使用mapviews:https://github.com/petedoyle/android-support-v4-googlemaps

不幸的是,我发现如果映射片段被从活动中删除,然后被读取,我会得到“你只能在MapActivity中有一个MapView”错误。

我理解了错误背后的原理,并尝试使用fragments onPause方法销毁mapview。不幸的是,我似乎不能完全销毁地图视图,因为我仍然可以得到它。我的代码看起来像这样:

代码语言:javascript
运行
复制
private RelativeLayout layout; 
private MapView mp;

public void onResume(){
    super.onResume();
    Bundle args = getArguments();
    if(mp == null)
    {
        mp = new MapView(getActivity(), this.getString(R.string.map_api_key)); 
        mp.setClickable(true);
    }

    String request = args.getString("requestId");
    layout = (RelativeLayout) getView().findViewById(R.id.mapholder);
    layout.addView(mp);
    //TextView txt = (TextView) getView().findViewById(R.id.arguments);
    //txt.setText(request);
}

public void onPause(){
    super.onPause();
    layout.removeView(mp);
    mp = null;
}

有没有人想过我在这里忽略了什么引用?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-11-30 21:15:53

我遇到了同样的问题。下面是我解决这个问题的方法:

  • 因为它应该只是activity中mapView的一个实例,所以我在Activity中的onCreate方法中初始化它:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);//以编程方式初始化要在片段中使用的MapView : this.mActivityMapView =新MapView(MainActivity.this,getString(R.string.debug_mapview_apikey));setContentView(R.layout.activity_main);}

  • 然后我在片段onCreateView方法中恢复它:

公共视图onCreateView(LayoutInflater inflater,ViewGroup容器,捆绑包savedInstanceState) { this.mMapView = ((MainActivity) getActivity()).getMapView();LayoutInflater this.mMapView;}

  • 和我在片段onDestroy方法中销毁它:

public void onDestroy() { NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) this.mMapView.getParent();parentView.removeView(this.mMapView);super.onDestroy();}

票数 15
EN

Stack Overflow用户

发布于 2011-12-23 20:32:20

您可能希望删除onPause方法(而不是onDestroy方法)中的地图视图

代码语言:javascript
运行
复制
public void onPause() {
    NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) this.mMapView.getParent();
    parentView.removeView(this.mMapView);
    super.onPause();}

通过这种方式,您可以将MapFragment添加到backstack。(FragmentTransaction.addToBackStack防止分片被销毁)

票数 6
EN

Stack Overflow用户

发布于 2012-02-05 14:18:47

Max和Bleeker的回答效果很好,但如果你想支持屏幕方向的改变,你需要特别小心,就像我一样。事实证明,当您旋转屏幕时,它将在不调用onPause方法的情况下再次调用OnCreateView,从而添加两次mapview。为了解决这个问题,我在OnCreateView中执行了以下操作:

代码语言:javascript
运行
复制
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
    this.mMapView = ((MyGameActivity) getActivity()).getMapView();
    if (this.mMapView.getParent()!=null)
    {
        NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) this.mMapView.getParent();
        parentView.removeView(this.mMapView);
    }
    return this.mMapView;
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7818448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档