【问题标题】:Fragment with MapView crashing on Touch after orientation change方向更改后,带有 MapView 的片段在 Touch 上崩溃
【发布时间】:2012-12-27 08:46:18
【问题描述】:

我的问题与下面链接中的问题相同,但我无法找出解决方案。并且无法弄清楚如何询问作者他的解决方案是什么。 Fragment with map crashes when I change activity and come back to the map

在方向改变之前,我的应用程序运行良好,在此之前,Touch 运行良好。在方向更改时,它会按应有的方式重绘 MapView,但是一旦用户在地图上执行任何 onTouch 操作,它就会使应用程序崩溃:

android.view.WindowManager$BadTokenException error 无法添加窗口 --token android.view.ViewRootImpl$blahblahblah 无效。

我正在使用 ActionBarSherlock 和 googlemaps 插件,正如其他问题使用的同一教程中所建议的那样。我只是不明白我应该如何在活动重新启动后方向更改后为 onTouch 事件创建一个新的侦听器。我曾尝试为 onTouch 事件创建一个新的 OnTouchListener,但由于我不确定,也找不到任何示例,所以我无法猜测如何再次在 MapView 上获得有效的 Touch 界面。

我确定这是我缺少的一些简单的东西。

我的代码:

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)

【问题讨论】:

  • 我已经添加了日志输出。在进一步测试中,如果我从不启用 zoomControls,则应用程序不会崩溃。所以我需要看看修复 zoomControls 的 parentView 是我的猜测

标签: android android-mapview fragment


【解决方案1】:

头撞墙几天后,我决定将地图系统升级为Google Maps Android API v2。这解决了我在使用缩放控件时遇到的问题。

按照以下说明操作:Using ActionBarSherlock With the New SupportMapFragment

我按照上述说明创建了一个 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;
}
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多