2011-10-19 9 views
11

私はここで見つけるフラグメントでmapviewsを使用するためのハックとアンドロイドの互換性クラスを使用しています:https://github.com/petedoyle/android-support-v4-googlemapsフラグメント付きのAndroidマップビューを2回追加することはできません。

は残念ながら、私が発見していますと、mapfragmentがアクティビティから削除した後、再び追加取得した場合、私が得るということです「MapActivityで1つのMapViewしか持たない」というエラーが表示されます。

エラーの原則を理解し、フラグメントonPauseメソッドで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; 
} 

誰も私がここで破壊するのを怠っている参照に何か考えを持っていますか?

答えて

15

同じ問題が発生しました。ここで私はそれを解決する方法である:

  • それは私が活動中のonCreateメソッドでそれを初期化し、活動中のMapViewの唯一のインスタンスである必要がありとおり:

    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); 
    } 
    
  • その後、私はそれを回復フラグメントの方法onCreateView:

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
        this.mMapView = ((MainActivity) getActivity()).getMapView(); 
        return this.mMapView; 
    } 
    
  • そして私は、フラグメントonDestroy方法でそれを破壊する:

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

はあなたがbackstackにMapFragmentを追加することができ、

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

onPauseメソッド(代わりのonDestroy法)でこの道をマップビューを削除する場合があります。 (フラグメントが破損するのを防ぐためにFragmentTransaction.addToBackStackを使用します)

6

MaxとBleekerの回答はうまくいきますが、画面の向きの変更をサポートしたい場合は特に注意する必要があります。画面を回転させると、onPauseメソッドを呼び出さずに再びOnCreateViewが呼び出され、マップビューが2回追加されます。それを修正するには、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; 
} 
4

私は、この問題に対する簡単な解決策を取得しようとしました。 Viewの詳細(RelativeLayout拡張機能)を処理するクラスで、private static MapView myMapView;と宣言しました。

その後、次のコードスニペットのようなonFinishInflate()メソッドをオーバーライドします。

@Override 
protected void onFinishInflate() { 
    super.onFinishInflate(); 

    //myMapView = (MapView) findViewById(R.id.map_view); 
    if (myMapView==null) 
     myMapView = new MapView(context, getResources().getString(R.string.map_view_api_key)); 
    if (myMapView.getParent() != null) 
     ((ViewGroup)myMapView.getParent()).removeView(myMapView); 

    myMapView.setClickable(true); 
    myMapView.setEnabled(true); 
    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT); 
    myMapView.setLayoutParams(lp);   
    this.addView(myMapView); 

} 

あなたのMapViewのインスタンスを1つだけ持ってこの方法です。

0

ここでは、フラグメントの場合にこの問題を解決しました。

レイアウト

<LinearLayout 
     android:id="@+id/ll_mapcontainer" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" /> 

を作成あなたは今、コードは次のようになりますあなたがマップに

を表示したいあなたのXMLファイル内の任意の場所にこのようなレイアウトを配置することができます。

package com.yuviii.sample; 

import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.yuviii.sample.R; 

/** 
* Created by yubraj Poudel on 12/20/15. 
*/ 
public class ContactUsFragment extends Fragment { 
    static final LatLng PRACTICAL_ANSWER_LOCATION = new LatLng(53.558, 9.927); 
    private SupportMapFragment fragment; 
    private GoogleMap map; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.page_contactus, container, false); 
     return v; 
    } 



    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
        initializeMap(); 
    } 

    private void initializeMap() { 

     FragmentManager fm = getChildFragmentManager(); 
     fragment = (SupportMapFragment) fm.findFragmentById(R.id.ll_mapcontainer); 
     if (fragment == null) { 
      fragment = SupportMapFragment.newInstance(); 
      fm.beginTransaction().replace(R.id.ll_mapcontainer, fragment).commit(); 
     } 

    } 
    @Override 
    public void onResume() { 
     super.onResume(); 
     if (map == null) { 
      map = fragment.getMap(); 
      map.addMarker(new MarkerOptions().position(PRACTICAL_ANSWER_LOCATION)); 
     } 
    } 
} 

これは私の仕事です。楽しい !!!

関連する問題