Android / Google Maps API: данные об исключениях: android.view.InflateException: строка двоичного XML-файла # 6: ошибка надувания класса java.lang.reflect.Constructor - PullRequest
0 голосов
/ 20 февраля 2011

Я создаю приложение, которое использует API Карт Google, но сталкивается с некоторыми проблемами, когда я подкласс MapView. Причина, по которой я пытаюсь создать подкласс MapView, заключается в том, что я хочу обнаруживать и использовать двойные касания и длительные нажатия на карте для выполнения некоторых функций. Я вложил в подклассы MapActivity и MapView, как и в другом приложении, где, кажется, это работает должным образом, но я не могу заставить его работать в этом новом приложении, так как я получаю исключение при запуске приложения:

Данные об исключении: 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);
          }

}

Как и макет XML для моей MapActivity, который его создает:

<?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>

Странно то, что если я заменил имя пакета / представления моего приложения в XML на default / normal "com.google.android.maps.MapView", мой код, кажется, работает нормально, но я не могу обнаружить двойной щелчки или длительные нажатия. Снова и снова сравнивая код с рабочим приложением, у меня не осталось ничего, кроме головной боли. Я представляю, что делаю что-то простое действительно неправильно, но я не могу понять, что в данный момент. Вот трассировка стека исключения, если это имеет значение, подкласс MapActivity - это TSMapAct, а основным действием является подкласс TabHost с именем ThisSpot:

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)

Спасибо за ваше время, Raymond

Ответы [ 2 ]

1 голос
/ 20 февраля 2011

Вы не реализуете конструктор, который ожидает логика инфляции. Я предлагаю вам реализовать все три конструктора, которые вы видите на MapView.

0 голосов
/ 24 февраля 2011

Я только что разгадал эту маленькую загадку. Хотя мне нужно было использовать конструктор, который я специально не реализовывал, похоже, это не является причиной исключения. Фактическая причина, по-видимому, заключается в том, что используются два разных 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, когда я вырезал и вставлял критические строки из другого проекта в этот проект. Излишне говорить, что интерфейсы OnGestureListener несовместимы.

Спасибо за вашу помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...