Android / Google Maps API:异常数据:android.view.InflateException:二进制XML文件行#6:错误膨胀类java.lang.reflect.Constructor

时间:2011-02-19 21:05:57

标签: android google-maps

我正在构建一个依赖于Google Maps API的应用程序,但在我将MapView子类化时遇到了一些问题。我试图继承MapView的原因是我想检测并使用双击和长按在地图上执行一些功能。我已经将MapActivity和MapView子类化了,就像我在另一个应用程序中那样,它似乎工作正常,但我似乎无法让它在这个新应用程序中工作,因为我在应用程序运行时不断获得异常: / p>

异常数据:android.view.InflateException:二进制XML文件行#6:错误膨胀类java.lang.reflect.Constructor

我的MapView子类非常简单:

import android.content.Context;
import android.util.AttributeSet;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;
import com.google.android.maps.MapView;

public class TSMapView extends MapView {
    private Context TSctx;
    private GestureDetector gDetector;
    public TSMapView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.TSctx = context;
        this.gDetector = new GestureDetector((OnGestureListener) TSctx);
        this.gDetector.setOnDoubleTapListener((OnDoubleTapListener)TSctx);
        this.gDetector.setIsLongpressEnabled(false);
    }
    public boolean onTouchEvent(MotionEvent ev) {
            if(this.gDetector.onTouchEvent(ev))
               return true;
            else
              return super.onTouchEvent(ev);
          }

}

我的MapActivity的XML布局实例化它:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent">
    <com.badlucksoft.thisspot.TSMapView android:id="@+id/tsmapview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:enabled="true" android:clickable="true" android:apiKey="<key>" />
</RelativeLayout>

奇怪的是,如果我使用默认/普通“com.google.android.maps.MapView”替换XML中的应用程序的包/视图名称,我的代码似乎工作正常,但我无法检测到双点击或长按。将代码一遍又一遍地与工作应用程序进行比较,让我头疼不已。我想我正在做一些简单的错误,但我现在无法弄明白。这是异常的堆栈跟踪,如果重要,MapActivity子类是TSMapAct,主要活动是一个名为ThisSpot的TabHost子类:

Exception data: android.view.InflateException: Binary XML file line #6: Error inflating class java.lang.reflect.Constructor
Stack Trace 0: android.view.LayoutInflater.createView(LayoutInflater.java:512)
Stack Trace 1: android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:564)
Stack Trace 2: android.view.LayoutInflater.rInflate(LayoutInflater.java:617)
Stack Trace 3: android.view.LayoutInflater.inflate(LayoutInflater.java:407)
Stack Trace 4: android.view.LayoutInflater.inflate(LayoutInflater.java:320)
Stack Trace 5: android.view.LayoutInflater.inflate(LayoutInflater.java:276)
Stack Trace 6: com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:313)
Stack Trace 7: android.app.Activity.setContentView(Activity.java:1620)
Stack Trace 8: com.badlucksoft.thisspot.TSMapAct.onCreate(TSMapAct.java:43)
Stack Trace 9: android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
Stack Trace 10: android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
Stack Trace 11: android.app.ActivityThread.startActivityNow(ActivityThread.java:2242)
Stack Trace 12: android.app.LocalActivityManager.moveToState(LocalActivityManager.java:127)
Stack Trace 13: android.app.LocalActivityManager.startActivity(LocalActivityManager.java:339)
Stack Trace 14: android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:631)
Stack Trace 15: android.widget.TabHost.setCurrentTab(TabHost.java:317)
Stack Trace 16: android.widget.TabHost.addTab(TabHost.java:210)
Stack Trace 17: com.badlucksoft.thisspot.ThisSpot.onCreate(ThisSpot.java:35)
Stack Trace 18: android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
Stack Trace 19: android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
Stack Trace 20: android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
Stack Trace 21: android.app.ActivityThread.access$2100(ActivityThread.java:116)
Stack Trace 22: android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
Stack Trace 23: android.os.Handler.dispatchMessage(Handler.java:99)
Stack Trace 24: android.os.Looper.loop(Looper.java:123)
Stack Trace 25: android.app.ActivityThread.main(ActivityThread.java:4203)
Stack Trace 26: java.lang.reflect.Method.invokeNative(Native Method)
Stack Trace 27: java.lang.reflect.Method.invoke(Method.java:521)
Stack Trace 28: com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
Stack Trace 29: com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
Stack Trace 30: dalvik.system.NativeStart.main(Native Method)

感谢您的时间, 雷蒙德

2 个答案:

答案 0 :(得分:1)

您没有实现通胀逻辑所期望的构造函数。我建议您实现在MapView上看到的所有三个构造函数。

答案 1 :(得分:0)

我刚刚解开了这个小小的谜团。虽然我确实需要使用我没有具体实现的构造函数,但这似乎不是异常的原因。实际原因似乎是使用了两个不同的OnGestureListener:TSMapView默认使用

import android.view.GestureDetector;
import android.view.GestureDetector.OnDoubleTapListener;
import android.view.GestureDetector.OnGestureListener;

TSMapAct正在使用

import android.gesture.GestureOverlayView;
import android.gesture.GestureOverlayView.OnGestureListener;

当我将其他项目中的关键行剪切并粘贴到此项目中时,Eclipse会自动添加这两种情况下的import语句。不用说,OnGestureListener接口不兼容。

感谢您的帮助!