Помогите: android.view.InflateException: строка двоичного XML-файла # 3: ошибка надувания класса com.google.android.maps.MapView - PullRequest
0 голосов
/ 03 сентября 2011

Я написал приложение Get Point (https://market.android.com/details?id=jv.android.getpoint&feature=search_result) для хранения координат GPS и экспорта файла KML для открытия в Google Планета Земля. Это приложение было создано, потому что мне нужно изучить платформу Android.

Поскольку я новичок в Android, пожалуйста, прости меня, если я задаю фиктивный вопрос.:)

Консоль разработчика Google Marked показывает мне, что есть ошибка, которую я не могу воспроизвести самостоятельно ни в эмуляторе(С Google APU, Galaxy S или Galaxy 5: (

Сообщение об ошибке: android.view.InflateException: строка двоичного XML-файла # 3: Ошибка надувания класса com.google.android.maps.MapView .

Я искал решение, но не смог найти ответ: (

Стек здесь:

 at android.view.InflateException: Binary XML file line #3: Error inflating class com.google.android.maps.MapView
 at android.view.LayoutInflater.createView(LayoutInflater.java:513)
 at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:565)
 at android.view.LayoutInflater.rInflate(LayoutInflater.java:618)
 at android.view.LayoutInflater.inflate(LayoutInflater.java:407)
 at android.view.LayoutInflater.inflate(LayoutInflater.java:320)
 at android.view.LayoutInflater.inflate(LayoutInflater.java:276)
 at jv.android.getpoint.ListaCoordAdapter.getView(ListaCoordAdapter.java:29)
 at android.widget.AbsListView.obtainView(AbsListView.java:1315)
 at android.widget.ListView.makeAndAddView(ListView.java:1727)
 at android.widget.ListView.fillDown(ListView.java:652)
 at android.widget.ListView.fillFromTop(ListView.java:709)
 at android.widget.ListView.layoutChildren(ListView.java:1580)
 at android.widget.AbsListView.onLayout(AbsListView.java:1147)
 at android.view.View.layout(View.java:7035)
 at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
 at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
 at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
 at android.view.View.layout(View.java:7035)
 at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
 at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
 at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
 at android.view.View.layout(View.java:7035)
 at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
 at android.view.View.layout(View.java:7035)
 at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
 at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
 at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
 at android.view.View.layout(View.java:7035)
 at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
 at android.view.View.layout(View.java:7035)
 at android.view.ViewRoot.performTraversals(ViewRoot.java:1045)
 at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
 at android.os.Handler.dispatchMessage(Handler.java:99)
 at android.os.Looper.loop(Looper.java:123)
 at android.app.ActivityThread.main(ActivityThread.java:4627)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:521)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
 at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.reflect.InvocationTargetException
 at com.google.android.maps.MapView.<init>(MapView.java:238)
 at java.lang.reflect.Constructor.constructNative(Native Method)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:446)
 at android.view.LayoutInflater.createView(LayoutInflater.java:500)
 ... 39 more
Caused by: java.lang.IllegalArgumentException: MapViews can only be created inside instances of MapActivity.
 at com.google.android.maps.MapView.<init>(MapView.java:282)
 at com.google.android.maps.MapView.<init>(MapView.java:255)
 ... 43 more

Основное действие имеетопция меню для вызова MapActivity. XML и код:

Чтобы запустить карту:

            Intent intent = new Intent(GetPointActivity.this, PointView.class);

            intent.putExtra("latitude", latitude);
            intent.putExtra("longitude", longitude);
            startActivity(intent);

Класс PointView:

public class PointView extends MapActivity {

    MapView mv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.maps);

        mv = (MapView)findViewById(R.id.mvPosicao);
        mv.setLongClickable(true);
        mv.setBuiltInZoomControls(true);

        Intent intent = getIntent();

        if (intent != null)
        {
            Bundle params = intent.getExtras();

            if (params != null) {
                Double lat = (Double) params.getDouble("latitude");
                Double lon = (Double) params.getDouble("longitude");

                markPosition (lat, lon);
            }
        }

        registerForContextMenu(mv);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu  menu) {            
        //Log.i("MYINFO", "I'm in");    
        MenuItem mi0 = menu.add(Menu.NONE, 0, 0, getString(R.string.mnVerMapa));
        mi0.setIcon(R.drawable.mapview);

        MenuItem mi1 = menu.add(Menu.NONE, 1, 1, getString(R.string.mnVerSatelite));
        mi1.setIcon(R.drawable.satelliteview);

        MenuItem mi2 = menu.add(Menu.NONE, 2, 2, getString(R.string.mnVerStreetView));
        mi2.setIcon(R.drawable.streetview);

        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {       
        switch (item.getItemId()) {
        case 0:
            mv.setSatellite(false);
            break;
        case 1: 
            mv.setSatellite(true);
            break;
        case 2: 
            mv.setStreetView(true);
            break;
        }

        return true;
    }    

    public void markPosition (Double lat, Double lon){
        int latE6 = (int)(lat*1E6);
        int lonE6 = (int)(lon*1E6);

        GeoPoint point = new GeoPoint(latE6, lonE6);

        ImageOverlay io = new ImageOverlay(new GeoPoint(latE6, lonE6), R.drawable.waypoint2);

        mv.getOverlays().add(io);
        mv.getController().setCenter(point);
    }   

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
}

XML PointView:

<?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       
    android:id="@+id/mvPosicao"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:enabled="true"
    android:clickable="true"
    android:apiKey="<my googlemaps key" />
</LinearLayout>

Мой манифест:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="<package>.getpoint"
      android:versionCode="1"
      android:versionName="1.0.1">
    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"></uses-permission>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>

    <application android:label="@string/app_name" android:icon="@drawable/maps">
        <uses-library android:name="com.google.android.maps" />
        <activity android:name=".GetPointActivity" android:label="@string/app_name" android:configChanges="keyboard|keyboardHidden|orientation">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <activity android:name=".PointView" android:configChanges="keyboard|keyboardHidden|orientation" android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar"/>
                </application>
</manifest>

Возможностьпоказать карту вызывается контекстным меню, отображаемым, когда пользователь долго нажимает ListView.Этот ListView имеет собственный адаптер (выделенная строка отображается в стеке):

public class ListaCoordAdapter extends ArrayAdapter<CoordToShow> {

    private List<CoordToShow> items;        
    Context context;

    public ListaCoordAdapter(Context context, int textViewResourceId, List<CoordToShow> items) {                
        super(context, textViewResourceId, items);                
        this.items = items;
        this.context = context;
    }        

    @Override        
    public View getView(int position, View convertView, ViewGroup parent) {                
        View v = convertView;                

        if (v == null) {                        
            LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);                
            **v = vi.inflate(R.layout.rowcoord, null);**                
        }                

        CoordToShow it = items.get(position);                
        if (it != null) {                        
            ImageView iv = (ImageView) v.findViewById(R.id.ivCoord);
            TextView l1 = (TextView) v.findViewById(R.id.linha1);
            TextView l2 = (TextView) v.findViewById(R.id.linha2);

            l1.setText(it.getNome());
            l2.setText(it.toString());

            if (iv != null) {         
                if (it.getTipo() == CoordToShow.PONTO)                  
                    iv.setImageResource(R.drawable.waypoint2);
                else 
                    iv.setImageResource(R.drawable.track);
            }                
        }                

        return v;        
    }
}

rowcoord xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     android:paddingTop="4dip"
     android:paddingBottom="6dip"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content" android:orientation="horizontal">
    <ImageView android:src="@drawable/waypoint2" android:id="@+id/ivCoord" android:layout_width="32dp" android:layout_height="32dp"></ImageView>

     <LinearLayout
         android:id="@+id/ll2"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content" android:orientation="vertical">
         <TextView android:id="@+id/linha1"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             android:textAppearance="?android:attr/textAppearanceMedium" />
         <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/linha2"></TextView>
     </LinearLayout>
</LinearLayout>

In Default.Property:

target=Google Inc.:Google APIs:8

Любая помощь будет оценена.

Ответы [ 2 ]

4 голосов
/ 03 сентября 2011

Суть вашей проблемы находится в самом низу трассировки стека: MapViews can only be created inside instances of MapActivity.По сути, инфляция происходит вне вашего PointView по любой причине.

Является ли jv.android.getpoint.ListaCoordAdapter одним из ваших классов?Из трассировки стека видно, что это класс, который пытается накачать макет.Если этот класс принадлежит вам, расширяет ли он MapActivity?

1 голос
/ 08 мая 2012

Я исправил это расширением MapActivity вместо Activity в классе активности, который вызывает MapView

...