3

私の問題は以下のリンクの問題と同じですが、解決策を見つけることができませんでした。そして、彼の解決策が何であるかを著者に尋ねる方法を理解することができませんでした。 アクティビティを変更してマップに戻ると、マップのフラグメントがクラッシュします

私のアプリは向きが変わるまで正常に動作し、タッチはその時点まで美しく動作します。向きを変更すると、MapViewが適切に再描画されますが、ユーザーがマップ上でonTouchアクションを実行するとすぐに、次のようにアプリがクラッシュします。

android.view.WindowManager$BadTokenExceptionエラーウィンドウを追加できません--tokenandroid.view.ViewRootImpl$blahblahblahは無効です。

他の質問で使用したのと同じチュートリアルで提案されているように、GooglemapsプラグインでActionBarSherlockを使用しています。向きを変えてアクティビティを再開した後、onTouchイベントの新しいリスナーを作成する方法がわかりません。onTouchイベントに対して新しいOnTouchListenerを作成しようとしましたが、確信がなく、例が見つからないため、MapViewで機能するタッチインターフェイスを再度取得する方法を推測できませんでした。

それは私が見逃している単純なものだと確信しています。

私が持っているコード:

public MainActivity extends SherlockFragmentActivity {
    private MapView mapView;
    private MapFragment mMapFragment;

    public void onCreate(Bundle savedInstanceState){
        View view = getLayoutInflater().inflate(R.layout.mapLayout, null);
        mapView = (MapView)view.findViewById(R.id.map);
        mapView.setBuiltInZoomControls(true);
        setContentView(R.layout.activity_main);
    }

    public void onResume(){
        setupFragments();
    }

    private void setupFragments(){
        final FragmentTransaction ft = getSupportFragmentManager().beginTransaction();

        mMapFragment = (MapFragment) getSupportFragmentManager().findFragmentByTag(MapFragment.TAG);
        if (mMapFragment == null){
            mMapFragment = new MapFragment(mapView);
            ft.add(R.id.fragment_container, mMapFragment, MapFragment.TAG);
        }
        ft.show(mMapFragment);
        ft.commit();
    }
}

public class MapFragment extends SherlockFragment{
    public static final String TAG = "MapFragment";
    private MapView mapView;
    private MapOverlay itemizedOverlay;

    public MapFragment(MapView mapView){
        this.mapView=mapView;
    }

    public void onResume(){
        super.onResume();
        List<Overlay> mapOverlays = mapView.getOverlays();

        itemizedOverlay(defaultActiveRoad, mapView.getContext());
        mapOverlays.add(itemizedOverlay);
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup vg, Bundle savedInstanceBundle){
        super.onCreateView(inflater,vg,savedInstanceBundle);
        return mapView;
    }

    public void onViewCreated(View view, Bundle savedInstanceState){
        super.onViewCreated(view, savedInstanceState);
    }

    public void onDestroyView(){
        super.onDestroyView();
        ((ViewGroup)mapView.getParent()).removeView(mapView);
    }

    public void setMapView (MapView mapView){
        this.mapView = mapView;
    }

    public MapView getMapView(){
        return mapView;
    }
}

エラーログには次のものが含まれます

android.view.WindowManager$BadTokenException: Unable to add window -- token android.view.ViewRootImpl$W@40fab3b0 is not valid; is your activity running?
at android.view.ViewRootImpl.setView(ViewRootImpl.java:585)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
at android.view.Window$LocalWindowManager.addView(Window.java:547)
at android.widget.ZoomButtonsController.setVisible(ZoomButtonsController.java:371)
at com.google.android.maps.MapView.displayZoomControls(MapView.java:1055)
at com.google.android.maps.MapView$1.onDown(MapView.java:341)
at com.google.android.maps.GestureDetector.onTouchEvent(GestureDetector.java:517)
at com.google.android.maps.MapView.onTouchEvent(MapView.java:685)
4

1 に答える 1

2

数日間壁に頭をぶつけた後、地図システムをGoogle Maps AndroidAPIv2にアップグレードすることにしました。これにより、ズームコントロールで発生していた問題が解決しました。

次の手順に従った後:新しいSupportMapFragmentでのActionBarSherlockの使用

上記の手順の指示に従ってSherlockMapFragmentを作成しましたが、アプリパッケージで作成しました。私のMapFragmentは、作成したばかりの新しいSherlockMapFragmentを拡張します。

public class MapFragment extends SherlockMapFragment {

public static final String TAG = "MapFragment";
private GoogleMap mapView;
private Application global;
public MapFragment(){
}

public void onCreate(Bundle savedInstanceBundle){
    super.onCreate(savedInstanceBundle);
    setRetainInstance(true);
}

public void onResume(){
    super.onResume();

    global = (Application)getSherlockActivity().getApplication();

}

public View onCreateView(LayoutInflater inflater, ViewGroup vg, Bundle savedInstanceBundle){
    View view=super.onCreateView(inflater, vg, savedInstanceBundle);
    mapView = getMap();
    return view;
}
}
于 2013-01-01T06:05:15.510 に答える