2011-09-03 1 views
0

J'ai écrit l'application Get Point (https://market.android.com/details?id=jv.android.getpoint&feature=search_result) pour stocker les coordonnées GPS et exporter un fichier KML à être ouvert dans Google Earth. Cette application a été créée parce que j'ai besoin d'apprendre la plate-forme Android. Parce que je suis nouveau sur Android s'il vous plaît pardonnez-moi si je demande une question factice. :)S'il vous plaît aidez: android.view.InflateException: Ligne de fichier XML binaire # 3: Erreur gonflage de classe com.google.android.maps.MapView

Google Marqué Developer Console me montre qu'il ya une erreur, je ne peux pas reproduire par moi-même, soit dans l'émulateur (Avec Google APU, Galaxy S ou Galaxy 5 :(

Le message d'erreur est: android .view.InflateException: binaire ligne fichier XML # 3:. erreur classe com.google.android.maps.MapView gonflage

Je cherchais une solution, mais n'a pas pu trouver une réponse :(

Le La pile est ici:

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 

L'activité principale dispose d'une option de menu pour appeler MapActivity. Le XML et le code:

Pour démarrer la carte:

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

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

La classe 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; 
    } 
} 

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

Mon Manifest:

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

L'option permettant d'afficher la carte est appelée par un menu contextuel affiché lorsque l'utilisateur appuie longuement sur ListView. Ce ListView a un adaptateur personnalisé (la ligne en surbrillance est affiché dans la pile):

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;   
    } 
} 

xml rowcoord:

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

En Default.Property:

target=Google Inc.:Google APIs:8 

Toute aide sera être apprécié.

+0

Qu'est-ce qui est dans votre fichier 'default.properties'? – inazaruk

Répondre

4

Le cœur de votre problème se situe tout en bas de la trace de la pile: MapViews can only be created inside instances of MapActivity. Fondamentalement, l'inflation se produit de l'extérieur de votre PointView pour une raison quelconque.

L'un de vos cours est-il jv.android.getpoint.ListaCoordAdapter? Il semble à partir de la trace de la pile que c'est la classe qui essaie de gonfler la mise en page. Si cette classe vous appartient, s'étend-elle à MapActivity?

+0

Merci. J'ai ajouté la classe ListaCoordAdapter et les valeurs Default.Properties. Le ListaCoordAdapter est juste un nouvel adaptateur pour un ListView, pas pour un MapView.Je l'ai vu dans la pile, mais je ne comprends pas pourquoi? :( –

+0

Vous avez la possibilité d'obtenir la trace complète de la pile (sans le '... 43 plus')? Peut-être y a-t-il un autre indice –

+0

Cette trace provient de Google Market, je n'ai pas pu reproduire l'erreur sur mon appareil/ordinateur: ( –

1

Je l'ai fixé par extension MapActivity au lieu de l'activité dans la classe d'activité qui appelle la MapView

Questions connexes