フラグメント付きのAndroid MapViewは2回追加できませんか?
-
26-10-2019 - |
質問
ここにあるフラグメントでMapViewsを使用するために、ハックを使用してAndroid互換性クラスを使用しています。 https://github.com/petedoyle/android-support-v4-googlemaps
残念ながら、私が見つけているのは、MapFragmentがアクティビティから削除されてから読み取られた場合、「MapActivityエラー」に「単一のMapView」を持つことが許可されていることです。
私はエラーの背後にある原則を理解しており、フラグメントオンポーズメソッドの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;
}
私がここで破壊することを怠っている参考文献について何か考えがありますか?
解決
私は同じ問題に遭遇しました。これが私がそれを解決した方法です:
アクティビティのMapViewの1つのインスタンスのみである必要があるため、アクティビティの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); }
次に、fragment 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(); }
他のヒント
OnPauseメソッドのマップビューを(OnDestroyメソッドの代わりに)削除することをお勧めします
public void onPause() {
NoSaveStateFrameLayout parentView = (NoSaveStateFrameLayout) this.mMapView.getParent();
parentView.removeView(this.mMapView);
super.onPause();}
このようにして、バックスタックにMapFragmentを追加できます。 (fragmenttransaction.addtobackstackは、フラグメントが破壊されないようにします)
MaxとBleekerの答えはうまく機能しますが、私と同じように、画面の向きの変更をサポートしたい場合は、特に注意する必要があります。画面を回転させると、OnPauseメソッドを呼び出すことなくOnCreateviewを再度呼び出し、MapViewを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;
}
この問題の簡単な解決策を取得しようとしました。私のビューの詳細を処理するクラス(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つだけです。
フラグメントの場合にこの問題を解決した方法は次のとおりです。
レイアウトを作成します
<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));
}
}
}
これは私のために働きます。楽しみ !!!