いくつかのアクティビティを含むアプリがありますが、各アクティビティにはいくつかのフラグメントがあります。アクティビティのレイアウトには Fragment Container として RelativeLayout があります。ActionBarSherlock でタブ ナビゲーションを追加しました。タブは地図を見るためのものです。
MapViewBalloons ライブラリを使用しました。タブをクリックすると、フラグメントが対応するフラグメントに置き換えられます。
Map Fragment では、静的変数を使用して mapView オブジェクトを保存し、このフラグメントにアクセスするたびに新しいオブジェクトを作成しないようにしました。
地図の断片に入り、そこに移動し、地図をタッチして移動できます。次に、アクティビティを変更せずに、タブを使用して別のフラグメントに変更します。同じマップ、同じ状況があり、そこに移動できます。
問題: 戻るボタンを押して向きを変えると (アクティビティが破棄されて再作成された場合だと思います)、マップに再び入ることができますが、そこに移動しようとするとクラッシュし、これが発生しますエラー:
ウィンドウを追加できません。トークン android.view.ViewRootImpl$... が無効です。アクティビティは実行されていますか?
static TapControlledMapView mapView;
onCreateView...
if (mapView == null) {
//do things
else
parentViewGroup.removeView(mapView);
Button botonFiltro = (Button) parentViewGroup
.findViewById(R.id.botonFiltro);
parentViewGroup.removeView(botonFiltro);
inf.addView(mapView);
return inf;
それが、「マップは1つしか持てない」ということを処理した方法です。
それで...アクティビティを変更するとクラッシュするのはなぜですか? parentViewGroup が null ではないことを確認したので、MapView には親があります (これに意味があるかどうかはわかりません)。
私の TabListener はそのようなものです。
public class MyTabListener は TabListener を実装します {
public Fragment fragment;
public MyTabListener(Fragment fragment) {
super();
this.fragment = fragment;
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
//TODO: onTabReselected
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
ft.replace(R.id.fragmentContainer, fragment);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
ft.remove(fragment);
}
最も奇妙なことは、最初にマップに触れなかった場合、または 2 回目にマップがクラッシュしないことです。
私はAndroidが初めてなので、正しいことをしていない可能性があります。誰でも私を助けることができますか?
編集: 別のライブラリを使用して、互換性のある ABS、フラグメント、およびマップを作成しました。私はこのブログに従っています: http://xrigau.wordpress.com/2012/03/22/howto-actionbarsherlock-mapfragment-listfragment/
修繕!問題は、私がコメントで話したものでした。リスナーは古いアクティビティに関連付けられました。新しいリスナーを追加して完了です!