web-dev-qa-db-fra.com

Android Fragment de Google Maps dans le xml. J'obtiens "Préfixe d'espace de noms inattendu"

J'essaie d'apprendre Android, et après avoir suivi les instructions sur la façon d'utiliser l'API Google Maps V.2, je l'ai maintenant fait fonctionner. Cependant, les instructions sur la façon de configurer l'état initial des cartes, trouvées à developers.google.com , suggèrent un espace de noms défini dans le fichier xml, dans ce cas "carte".

Le code xml ci-dessous donne l'erreur med "Préfixe d'espace de noms inattendu" map "". Essayer de définir le xmlns: map à l'intérieur de la balise fragment a donné la même erreur mais avec "xmlns".

Il me manque évidemment des connaissances fondamentales sur le xml ici, quelqu'un peut-il m'aider?

<RelativeLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"        
    xmlns:tools="http://schemas.Android.com/tools"
    xmlns:map="http://schemas.Android.com/apk/res-auto"      <!-- Definition -->
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <fragment 
        Android:id="@+id/map"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        class="com.google.Android.gms.maps.SupportMapFragment"
        map:cameraBearing="112.5"/>                            <!-- PROBLEM -->

</RelativeLayout>
34
Alex

Vous devez faire deux choses:

Tout d'abord: https://docs.google.com/document/pub?id=19nQzvKP-CVLd7_VrpwnHfl-AE9fjbJySowONZZtNHzw

Ajoutez la dépendance aux services Google Play dans votre projet

Project -> Properties -> Android -> Library, Add -> google-play-services_lib

Deuxièmement: https://developers.google.com/maps/documentation/Android/intro

Sélectionnez Project > Properties, sélectionnez Java Build Path et accédez à Libraries. Sélectionnez Add External Jars, incluez les fichiers jar suivants, puis cliquez sur OK:

<Android-sdk-folder>/extras/Android/compatibility/v4/Android-support-v4.jar

Maintenant, mon projet ne montre plus d'erreur :)

20
marcel

J'ai aussi eu ce problème. J'ai fait Project/Clean et l'erreur a disparu et ça fonctionne bien maintenant.

26
Kent

J'ai le même problème aujourd'hui. J'ai mis à jour le SDK hier soir et je n'ai pas vu ce problème auparavant. J'ai également chargé le Android Exemple de projet de démonstration de Map V2 et le fichier "multimap_demo.xml" affiche l'erreur "Carte de préfixe d'espace de noms inattendue" trouvée pour le fragment de balise ". J'ai appliqué le xml inclure suggéré et cela fonctionne à nouveau. Donnerait un +1 mais n'a obtenu aucun crédit.

MISE À JOUR: J'ai oublié ce problème et j'ai retravaillé mon code aujourd'hui et supprimé l'inclusion. Bien sûr, l'erreur est revenue. J'ai trouvé cela et l'ai ajouté à la mise en page dans la strophe de fragment:

tools:ignore="MissingPrefix"

Cela semble au moins masquer le problème.

Mise à jour: ce bogue se produit apparemment en raison d'un bogue dans Android Lint Tool. Report issue https://code.google.com/p/gmaps-api-issues/issues/ détail? id = 5002

19
WigglyWorld

Il existe une autre solution de contournement qui vous permet de continuer à tout configurer dans les fichiers de disposition au lieu du code Java. Étant donné que l'erreur ne semble se produire que lorsque le SupportMapFragment est un enfant de un ViewGroup dans le fichier de mise en page, on peut extraire le <fragment> élément dans son propre fichier de mise en page, puis il suffit de l'inclure dans la mise en page plus grande souhaitée.

Par exemple, étant donné que vous essayez de faire ceci:

my_awesome_layout.xml

...
<RelativeLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"        
    xmlns:map="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <fragment 
        Android:id="@+id/map"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        class="com.google.Android.gms.maps.SupportMapFragment"
        map:cameraBearing="112.5"/>

</RelativeLayout>

Vous pouvez plutôt le décomposer comme suit:

include_map_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:map="http://scheams.Android.com/apk/res-auto"
    Android:id="@+id/map"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    class="com.google.Android.gms.maps.SupportMapFragment"
    map:cameraBearing="112.5"/>

my_awesome_layout.xml

...
<RelativeLayout 
    xmlns:Android="http://schemas.Android.com/apk/res/Android"        
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <include 
        Android:id="@+id/map"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        layout="@layout/include_map_fragment" />

</RelativeLayout>
13
Scott W

Eh bien, je sais, ce n'est pas vraiment une solution au problème d'espace de nom, peut-être que cela pourrait aider.

Comme je ne connais aucune solution XML, je l'ai fait par programmation:

mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
mMap.setTrafficEnabled(true);
setupMapView();

private void setupMapView(){
 UiSettings settings = mMap.getUiSettings();        
 mMap.animateCamera(CameraUpdateFactory.newCameraPosition(
  new CameraPosition(new LatLng(50.0, 10.5), 
  13.5f, 30f, 112.5f))); // zoom, tilt, bearing
 mMap.setTrafficEnabled(true);
 settings.setAllGesturesEnabled(true);
 settings.setCompassEnabled(true);
 settings.setMyLocationButtonEnabled(true);
 settings.setRotateGesturesEnabled(true);
 settings.setScrollGesturesEnabled(true);
 settings.setTiltGesturesEnabled(true);
 settings.setZoomControlsEnabled(true);
 settings.setZoomGesturesEnabled(true);
}

Ainsi, Google Map est initialisé par défaut mais obtient ses paramètres directement après cela à partir du code.

4
Tobias Reich

J'ai exactement le même problème. L'exemple fourni

<fragment xmlns:Android="http://schemas.Android.com/apk/res/Android"
  xmlns:map="http://schemas.Android.com/apk/res-auto"
  Android:id="@+id/map"
  Android:layout_width="match_parent"
  Android:layout_height="match_parent"
  class="com.google.Android.gms.maps.SupportMapFragment"
  map:cameraBearing="112.5"
  map:cameraTargetLat="-33.796923"
  map:cameraTargetLng="150.922433"
  map:cameraTilt="30"
  map:cameraZoom="13"
  map:mapType="normal"
  map:uiCompass="false"
  map:uiRotateGestures="true"
  map:uiScrollGestures="false"
  map:uiTiltGestures="true"
  map:uiZoomControls="false"
  map:uiZoomGestures="true"/>

fonctionne bien, mais si vous essayez de l'ajouter dans un élément parent, il refuse d'accepter les xmlns. Si vous déplacez la déclaration xmlns vers l'élément supérieur, elle refuse toujours d'accepter le préfixe de carte dans le fragment:

Unexpected namespace prefix "map" found for tag fragment

Maintenant, si vous étendez SupportMapFragment et utilisez une vue personnalisée comme celle-ci:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:map="http://schemas.Android.com/apk/res-auto"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:padding="5dp">

    <com.google.Android.gms.maps.MapView
        Android:id="@+id/map_view"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" 
        map:cameraBearing="0" 
        map:cameraTargetLat="54.25"
        map:cameraTargetLng="-4.56"
        map:cameraTilt="30"
        map:cameraZoom="5.6"
        map:mapType="normal"
        map:uiCompass="true"
        map:uiRotateGestures="true"
        map:uiScrollGestures="true"
        map:uiTiltGestures="true"
        map:uiZoomControls="false"
        map:uiZoomGestures="true">

    </com.google.Android.gms.maps.MapView>

</LinearLayout>

... alors il ne se plaint pas et la carte résultante est correcte. Pour moi, cela pose d'autres problèmes, car il n'y a pas d'exemples décents de la façon de faire ce sous-classement, vous devez faire plus que remplacer onCreateView et lorsque j'essaie de faire quoi que ce soit sur la carte par la suite, j'obtiens ce qui suit :

Java.lang.IllegalStateException: Map size should not be 0. Most likely, layout has not yet occured for the map view.

... même si j'attends 30 secondes après que la carte soit apparue. (seulement le premier chargement)

3
colesadam

Je ne pense pas que vous puissiez mettre des commentaires XML à l'intérieur une balise comme vous le faites avec <!-- Definition -->. Si vous supprimez cela, le problème persiste-t-il?

1
Matt

Dans mon cas une grosse miss, j'oublie d'ajouter dans le fichier gradle ma dépendance google map:

compile 'com.google.Android.gms:play-services-maps:11.2.0'
0
Pablo Cegarra

De toute évidence, ce n'est qu'une erreur de vérification des peluches. Vous pouvez le supprimer lorsque, dans la vue Eclipse Vue problème, vous cliquez avec le bouton droit sur la ligne contenant l'erreur, sélectionnez l'option Correction rapide et sélectionnez par ex. Ignorer la vérification du projet.

L'erreur disparaît, le projet se construit et l'application fonctionne parfaitement bien.

0
Ridcully