複数のマップを処理するための最良の方法を決定しようとしています。単一のマップに物事を追加および削除するか、2つのマップフラグメントを切り替える必要があります。戻るボタンを簡単に利用できるので、フラグメントを操作する方が理想的だと思います。
ボタンクリックで複数のマップフラグメントをshow()およびhide()しようとすると、問題が発生します。show()/ hidden()を使用してもマップは変更されません。たぶん誰かが私のためにこれが起こっている理由にいくつかの光を当てることができるので、私はショーと非表示のマップビューで実際に何が起こっているのかをよりよく理解することができます。マップフラグメントの表示と非表示に問題があった人はいますか?
ボタンをクリックしてもマップビューは変更されませんが、ボタンをもう一度クリックしない限り制御できなくなります。フラグメントが切り替わっているように見えますが、実際にはビューが変更されていません。replace()を使用して正しく機能することは確かですが、これはマップをロードする目的を無効にします。
package com.test.googletestmaps;
public class ControlFragment extends SherlockFragmentActivity implements
OnClickListener {
private GoogleMap mMap;
private GoogleMap mMap2;
private SupportMapFragment gmap;
private SupportMapFragment gmap2;
private ImageButton button;
private int mapShown;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_control_fragment);
gmap = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map1));
gmap2 = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map2));
if (savedInstanceState == null) {
// First incarnation of this activity.
gmap.setRetainInstance(true);
} else {
// Reincarnated activity. The obtained map is the same map instance
// in the previous
// activity life cycle. There is no need to reinitialize it.
mMap = gmap.getMap();
}
if (savedInstanceState == null) {
// First incarnation of this activity.
gmap2.setRetainInstance(true);
} else {
// Reincarnated activity. The obtained map is the same map instance
// in the previous
// activity life cycle. There is no need to reinitialize it.
mMap2 = gmap2.getMap();
}
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.hide(gmap2);
ft.commit();
button = ((ImageButton) findViewById(R.id.cacbutton));
button.setOnClickListener(this);
button.setVisibility(View.VISIBLE);
mapShown = 0;
setUpMapIfNeeded();
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
// Do a null check to confirm that we have not already instantiated the
// map.
if (mMap == null) {
// Try to obtain the map from the SupportMapFragment.
mMap = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map1)).getMap();
// Check if we were successful in obtaining the map.
if (mMap != null) {
setUpMap(0);
}
}
if (mMap2 == null) {
mMap2 = ((SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map2)).getMap();
if (mMap2 != null) {
setUpMap(1);
}
}
}
private void setUpMap(int mapNumber) {
switch (mapNumber) {
case 0:
mMap.getUiSettings().setZoomControlsEnabled(true);
mMap.addMarker(new MarkerOptions().position(new LatLng(5, 5)).title("Marker for map1"));
break;
case 1:
mMap2.getUiSettings().setZoomControlsEnabled(true);
mMap2.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker for map2"));
break;
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu with the options to show the Map and the ListView.
getSupportMenuInflater()
.inflate(R.menu.activity_control_fragment, menu);
return true;
}
@Override
public void onClick(View v) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out);
if (mapShown == 0)
{
ft.hide(gmap);
ft.show(gmap2);
mapShown = 1;
}
else
{
ft.hide(gmap2);
ft.show(gmap);
mapShown = 0;
}
ft.addToBackStack(null);
ft.commit();
}
}
編集:マップフラグメントを表示および非表示にする方法を説明するこのgetView().setVisibility()
リンクを見つけました。使用してみましたが、同じ結果が得られます。
編集:これは明らかに簡単に解決できるものではありません。私は周りを見回しましたが、これに対する解決策を見つけることができません。今のところ、フラグメントを制御するために追加/削除を使用します。
これはまだ解決されていません....私は別のルートを取りました。フラグメントの表示/非表示は、新しいGoogleマップフラグメントの複数のインスタンスでは機能しません。理由はわかりません。この問題の解決策や理由を見つけた場合は、投稿して共有してください。