2010-11-10 24 views
1

J'ai une activité Android simple qui devrait présenter un certain statut à la fois sur une carte et sous forme textuelle.Inflate mapview deuxième fois jette l'exception

Je l'ai fait comme deux mises en page que je permute avec setContentView(). Au début, cela fonctionne bien, afficher la carte. Je peux ensuite passer à l'affichage des textes en appuyant sur le bouton de menu et en sélectionnant Affichage texte. Mais quand je veux revenir en arrière pour mapper le setContentView (R.layout.main); (cette disposition ne contient qu'une MapView et une disposition linéaire) émet l'exception suivante:

android.view.InflateException: Binary XML file line #7: 
    Error inflating class <unknown> 

Vous avez des idées? Je suis tout à fait nouveau pour le développement Android, donc je ne sais pas avec certitude que c'est la meilleure façon de résoudre le problème.

listing Source:

maptest.java:

public class maptest extends MapActivity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

MapView mapView = (MapView) findViewById(R.id.mapview); 
mapView.setBuiltInZoomControls(true); 

MapController mapController = mapView.getController(); 

mapController.setCenter(new GeoPoint((int)(65.319416667*1000000), 
      (int)(18.073833333*1000000))); 

mapController.setZoom(8); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu){ 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 
return true; 
    }  

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection 
    switch (item.getItemId()) { 

    case R.id.map_view: 
    try{ 
     setContentView(R.layout.main); 
    } 
    catch (Exception e) { 
     System.out.println("Error"); 
     System.out.println(e.toString()); 
    } 

    return true; 

    case R.id.text_view: 
    setContentView(R.layout.statustext); 
    return true; 

    default: 
     return super.onOptionsItemSelected(item); 
    } 
    } 

} 

Main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    > 

statustext.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
    <TextView android:id="@+id/TextView01" android:layout_width="wrap_content" 
     android:layout_height="wrap_content" android:text="Status text"></TextView> 
</LinearLayout> 

manifeste:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.csr.maptest" 
    android:versionCode="1" 
    android:versionName="1.0"> 

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <activity android:name=".maptest" 
       android:label="@string/app_name"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 

</manifest> 

menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:id="@+id/text_view" 
     android:title="Text view" />   
    <item android:id="@+id/map_view" 
     android:title="Map view" /> 
</menu> 
+0

Avez-vous savoir comment résoudre ce problème? – dineth

Répondre

1

Avez-vous manqué quelque chose dans le Main.xml? Je ne peux pas voir le

<com.google.android.maps.MapView ... /> 

et vous n'avez pas fermé le LinearLayout.

Cependant, le problème est que vous êtes uniquement autorisé à instancier un seul MapView dans une MapActivity. Je pense que chaque fois que vous ne

setContentView(R.layout.main); 

votre MapView sera gonflé et MapView est instancié. Ainsi, vous pouvez mieux créer le MapView dans le code et de prendre soin, que vous instanciez une seule fois:

if (mapView == null) 
    mapView = new MapView(this, "your-api-key"); 

et

findViewById(R.id.LinearLayout01).addView(mapView);