带有片段的Android mapview无法添加两次?

akh*_*lsa 11 android view android-fragments android-mapview

我使用Android兼容性类与黑客在这里找到的片段中使用mapviews:https://github.com/petedoyle/android-support-v4-googlemaps

不幸的是,我发现如果mapfragment从活动中删除,然后重新读取,我得到"你只允许在MapActivity中有一个MapView"错误."

我理解错误背后的原理,并尝试在片段onPause方法中销毁mapview.不幸的是,我似乎无法完全破坏mapview,因为我仍然得到它.我的代码看起来像这样:

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;
}
Run Code Online (Sandbox Code Playgroud)

有没有人对我在这里忽略的参考资料有什么想法?

Max*_*Max 15

我遇到了同样的问题.这是我解决它的方式:

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

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // initialize MapView programmatically to be used in Fragment :
        this.mActivityMapView = new MapView(MainActivity.this, getString(R.string.debug_mapview_apikey));
    
        setContentView(R.layout.activity_main);
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 然后我在片段onCreateView方法中恢复它:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        this.mMapView = ((MainActivity) getActivity()).getMapView();
        return this.mMapView;
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 我在片段onDestroy方法中将其销毁:

    public void onDestroy() {
        NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) this.mMapView.getParent();
        parentView.removeView(this.mMapView);
        super.onDestroy();
    }
    
    Run Code Online (Sandbox Code Playgroud)


Mar*_*ker 6

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

public void onPause() {
    NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) this.mMapView.getParent();
    parentView.removeView(this.mMapView);
    super.onPause();}
Run Code Online (Sandbox Code Playgroud)

这样,您可以将MapFragment添加到Backstack.(FragmentTransaction.addToBackStack可防止片段被破坏)


Mat*_*ttF 6

Max和Bleeker的答案效果很好但是如果你想支持屏幕方向的改变,你需要特别小心,就像我一样.当你旋转屏幕时,它会再次调用OnCreateView而不调用onPause方法,因此添加了两次mapview.要解决它,在OnCreateView中我做了以下事情:

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;
}
Run Code Online (Sandbox Code Playgroud)