MapView: сбой приложения при запуске - PullRequest
0 голосов
/ 04 июня 2010

Я пытаюсь отобразить карту, которая поворачивается в соответствии с ориентацией телефона. Я переписал часть примера 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> 

Рез / макет / 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

Теперь я знаю, откуда возникла проблема; но я не знаю, как создать свой MapView, используя файл main.xml.

Вместо этого я использую новый MapView (); это работает, но это хороший способ сделать это?

1 Ответ

0 голосов
/ 04 июня 2010

Если вы определяете класс для представления, имя класса должно быть записано в элементе XML-файла. В этом случае похоже, что функция onCreate не указана в файле макета main.xml. Попробуйте layout.findViewById (R.id.mapview); вместо просто findViewById (R.id.mapview) ;. Если это не сработает, вы также можете попробовать добавить это до вызова карты:

setContentView(R.layout.main);
...