views:

87

answers:

3

Hello, I'm trying to display a map using that rotates according to the phone's orientation. I have rewrite a part of the google sample to use a SensorEventListner instead of a SensorListener.

My Problem is when I try to use the findViewByID() method to display the map my application crashes on start. If I use MapView(Context, String) to create my view it works fine. Did I miss something to use main.xml layout file ? What's wrong with this ?

Thanks in advance.

Here is my code :

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/layout/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>
A: 

If you define a class for a view, the class name should be written in the item of the xml file. In this case it looks like the onCreate function isn't referenced to your layout main.xml file. Try layout.findViewById(R.id.mapview); instead of just findViewById(R.id.mapview);. If that doesn't work you can also try adding this in before the call to the mapview:

setContentView(R.layout.main);
James Santiago
A: 

Can you include the stack trace from the crash, which you can find in adb logcat just after the crash occurs?

Steve
A: 
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}

I think the problem is that I call setContentView() 2 times :

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

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

I've tried to Comment the first setContentView(R.layout.main); but the application is still crashing at launch time. It result in a 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

Now I know where the problem commes from; but I don't know how to create my MapView using the main.xml file.

I'm using new MapView() instead; it does work, but is it the good way to do it?

Paul