MapView:启动时应用程序崩溃

时间:2010-06-04 03:25:13

标签: android google-maps android-mapview

我正在尝试使用根据手机方向旋转的地图来显示地图。我已经重写了Google示例的一部分,以使用SensorEventListner代替SensorListener

我的问题是,当我尝试使用findViewByID()方法显示地图时,我的应用程序在启动时崩溃。如果我使用MapView(Context, String)创建我的视图,它可以正常工作。我错过了使用main.xml布局文件的内容吗?这有什么问题?

提前致谢。

这是我的代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
    mRotateView = new RotateView(this);
    // Seems ok
    mMapView = new MapView(this, "0t6yfD1f6K1wZe99RmpB2KdpQHl23WZSPRtGLEg");

    // Does not work: application crash on launch.
    //setContentView(R.layout.main);
    //mMapView = (MapView) findViewById(R.id.mapview);

    mRotateView.addView(mMapView);
    setContentView(mRotateView);

    mMyLocationOverlay = new MyLocationOverlay(this, mMapView);
    mMyLocationOverlay.runOnFirstFix(new Runnable() {
        public void run() {
            mMapView.getController().animateTo(
                    mMyLocationOverlay.getMyLocation());
        }
    });
    mMapView.getOverlays().add(mMyLocationOverlay);
    mMapView.getController().setZoom(18);
    mMapView.setClickable(true);
    mMapView.setEnabled(true);
    mMapView.setBuiltInZoomControls(true);

}

AndroidManifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.hello" android:versionCode="1"
    android:versionName="1.0">

        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.INTERNET" />

    <application android:icon="@drawable/icon" android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar">

        <uses-library android:name="com.google.android.maps" />

        <activity android:name=".HelloGoogleMapsActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>

</manifest> 

RES /布局/ main.xml中:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<com.google.android.maps.MapView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/mapview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true"
android:apiKey="0t6yfD1f6K1wZe99RmpB2KdpQHl23WZSPRtGLEg"
/>
</LinearLayout>

06-04 18:07:31.512: INFO/ActivityManager(66): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=com.example.hello/.HelloGoogleMapsActivity }
06-04 18:07:31.842: INFO/ActivityManager(66): Start proc com.example.hello for activity com.example.hello/.HelloGoogleMapsActivity: pid=207 uid=10025 gids={3003, 1015}
06-04 18:07:33.053: ERROR/ActivityThread(207): Failed to find provider info for com.google.settings
06-04 18:07:33.063: ERROR/ActivityThread(207): Failed to find provider info for com.google.settings
06-04 18:07:33.093: ERROR/ActivityThread(207): Failed to find provider info for com.google.settings
06-04 18:07:33.282: DEBUG/qemud(34): fdhandler_accept_event: accepting on fd 10
06-04 18:07:33.282: DEBUG/qemud(34): created client 0x150b8 listening on fd 15
06-04 18:07:33.282: DEBUG/qemud(34): client_fd_receive: attempting registration for service 'sensors'
06-04 18:07:33.282: DEBUG/qemud(34): client_fd_receive:    -> received channel id 8
06-04 18:07:33.292: DEBUG/qemud(34): client_registration: registration succeeded for client 8
06-04 18:07:33.302: DEBUG/qemud(34): fdhandler_event: disconnect on fd 15
06-04 18:07:33.312: DEBUG/SensorManager(207): found sensor: Goldfish 3-axis Accelerometer, handle=0
06-04 18:07:33.725: DEBUG/AndroidRuntime(207): Shutting down VM
06-04 18:07:33.725: WARN/dalvikvm(207): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
06-04 18:07:33.732: ERROR/AndroidRuntime(207): Uncaught handler: thread main exiting due to uncaught exception
06-04 18:07:33.772: ERROR/AndroidRuntime(207): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.hello/com.example.hello.HelloGoogleMapsActivity}: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at android.app.ActivityThread.access$2100(ActivityThread.java:116)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at android.os.Looper.loop(Looper.java:123)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at android.app.ActivityThread.main(ActivityThread.java:4203)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at java.lang.reflect.Method.invokeNative(Native Method)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at java.lang.reflect.Method.invoke(Method.java:521)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at dalvik.system.NativeStart.main(Native Method)
06-04 18:07:33.772: ERROR/AndroidRuntime(207): Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at android.view.ViewGroup.addViewInner(ViewGroup.java:1856)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at android.view.ViewGroup.addView(ViewGroup.java:1751)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at android.view.ViewGroup.addView(ViewGroup.java:1708)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at android.view.ViewGroup.addView(ViewGroup.java:1688)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at com.example.hello.HelloGoogleMapsActivity.onCreate(HelloGoogleMapsActivity.java:156)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
06-04 18:07:33.772: ERROR/AndroidRuntime(207):     ... 11 more
06-04 18:07:33.812: INFO/Process(66): Sending signal. PID: 207 SIG: 3
06-04 18:07:33.822: INFO/dalvikvm(207): threadid=7: reacting to signal 3
06-04 18:07:33.962: INFO/dalvikvm(207): Wrote stack trace to '/data/anr/traces.txt'
06-04 18:07:34.412: INFO/ARMAssembler(66): generated scanline__00000077:03515104_00000000_00000000 [ 27 ipp] (41 ins) at [0x2aa9e8:0x2aaa8c] in 1786681 ns
06-04 18:07:34.442: INFO/ARMAssembler(66): generated scanline__00000077:03515104_00001001_00000000 [ 64 ipp] (84 ins) at [0x2ac4f8:0x2ac648] in 2802312 ns
06-04 18:07:41.580: WARN/ActivityManager(66): Launch timeout has expired, giving up wake lock!
06-04 18:07:42.550: WARN/ActivityManager(66): Activity idle timeout for HistoryRecord{4379c288 com.example.hello/.HelloGoogleMapsActivity}

我认为问题是我调用了setContentView()2次:

setContentView(R.layout.main);
mMapView = (MapView) findViewById(R.id.mapview);

mRotateView.addView(mMapView);
setContentView(mRotateView);

我试过注释第一个setContentView(R.layout.main);但是应用程序在发布时仍然崩溃。它导致NullPointerException:

06-05 10:30:10.272: WARN/dalvikvm(211): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
06-05 10:30:10.282: ERROR/AndroidRuntime(211): Uncaught handler: thread main exiting due to uncaught exception
06-05 10:30:10.312: ERROR/AndroidRuntime(211): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.hello/com.example.hello.HelloGoogleMapsActivity}: java.lang.NullPointerException
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at android.app.ActivityThread.access$2100(ActivityThread.java:116)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at android.os.Looper.loop(Looper.java:123)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at android.app.ActivityThread.main(ActivityThread.java:4203)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at java.lang.reflect.Method.invokeNative(Native Method)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at java.lang.reflect.Method.invoke(Method.java:521)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at dalvik.system.NativeStart.main(Native Method)
06-05 10:30:10.312: ERROR/AndroidRuntime(211): Caused by: java.lang.NullPointerException
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at android.view.ViewGroup.addView(ViewGroup.java:1701)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at android.view.ViewGroup.addView(ViewGroup.java:1688)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at com.example.hello.HelloGoogleMapsActivity.onCreate(HelloGoogleMapsActivity.java:156)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
06-05 10:30:10.312: ERROR/AndroidRuntime(211):     ... 11 more

现在我知道问题出在哪里了;但我不知道如何使用main.xml文件创建我的MapView。

我正在使用新的MapView();它确实有效,但这是一个很好的方法吗?

1 个答案:

答案 0 :(得分:0)

如果为视图定义类,则应将类名写入xml文件的项目中。在这种情况下,看起来onCreate函数未引用布局main.xml文件。尝试layout.findViewById(R.id.mapview);而不仅仅是findViewById(R.id.mapview);.如果这不起作用,您也可以尝试在调用mapview之前添加它:

setContentView(R.layout.main);