it-swarm.dev

Android Fragmento do Google Maps no xml. Recebo "Prefixo de espaço para nome inesperado"

Estou tentando aprender o Android e, depois de seguir as instruções sobre como usar a API do Google Maps V.2, comecei a trabalhar. No entanto, as instruções sobre como configurar o estado inicial dos mapas, encontradas em developers.google.com , sugerem um espaço para nome definido no arquivo xml, neste caso "map".

O código xml abaixo fornece o erro medido "Prefixo inesperado de namespace" map "". Tentando definir o xmlns: map dentro da tag fragment deu o mesmo erro, mas com "xmlns".

Obviamente, estou perdendo algum conhecimento xml fundamental aqui, alguém pode me ajudar?

<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

Você tem que fazer duas coisas:

Primeiro: https://docs.google.com/document/pub?id=19nQzvKP-CVLd7_VrpwnHfl-AE9fjbJySowONZZtNHzw

Adicione a dependência ao Google Play Services ao seu projeto

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

Segundo: https://developers.google.com/maps/documentation/Android/intro

Selecione Project > Properties, selecione Java Build Path e navegue até Libraries. Selecione Add External Jars, inclua os seguintes arquivos jar e clique em OK:

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

Agora meu projeto não mostra mais erros :)

20
marcel

Eu tive esse problema também. Eu fiz o Project/Clean e o erro foi embora e agora funciona bem.

26
Kent

Eu tenho o mesmo problema hoje. Atualizei o SDK ontem à noite e não vi esse problema antes. Eu também carreguei o projeto Android Mapa V2 de exemplo de amostra do Map V2) e hoje o arquivo "multimap_demo.xml" está mostrando o erro "Mapa de prefixo de espaço para nome inesperado" encontrado "para fragmento de marca". Apliquei o xml inclua sugerido e está funcionando novamente. Daria um +1, mas não obteve cred.

ATUALIZAÇÃO: Esqueci-me deste problema e reformulei meu código hoje e removi a inclusão. Claro que o erro voltou. Encontrei isso e o adicionei ao layout na estrofe do fragmento:

tools:ignore="MissingPrefix"

Parece pelo menos mascarar o problema.

Atualização: aparentemente, esse erro ocorre devido a um erro em Android Lint Tool. Consulte o problema https://code.google.com/p/gmaps-api-issues/issues/ detail? id = 5002

19
WigglyWorld

Há outra solução alternativa que permite continuar configurando tudo nos arquivos de layout, e não no código Java. Já que o erro parece ocorrer apenas quando o SupportMapFragment é filho de a ViewGroup no arquivo de layout, é possível extrair o <fragment> elemento em seu próprio arquivo de layout e depois inclua-o no layout maior desejado.

Por exemplo, considerando que você está tentando fazer isso:

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>

Você poderia dividi-lo da seguinte maneira:

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

Bem, eu sei, isso não é realmente uma solução para o problema do espaço para nome, talvez isso possa ajudar.

Como não conheço nenhuma solução XML, fiz isso programaticamente:

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

Portanto, o Google Map é inicializado por padrão, mas obtém seus parâmetros diretamente após o código.

4
Tobias Reich

Eu tenho exatamente o mesmo problema. O exemplo fornecido

<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"/>

funciona bem, mas se você tentar adicioná-lo a um elemento pai, ele se recusa a aceitar os xmlns. Se você mover a declaração xmlns para o elemento superior, ela ainda se recusará a aceitar o prefixo do mapa no fragmento:

Unexpected namespace prefix "map" found for tag fragment

Agora, se você estender o SupportMapFragment e usar uma exibição personalizada como esta:

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

... então não reclama e o mapa resultante está correto. Para mim, isso levanta mais problemas, no entanto, como não há exemplos decentes de como fazer essa subclasse, você precisa fazer mais do que substituir onCreateView e quando tento fazer alguma coisa no mapa posteriormente, recebo o seguinte :

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

... mesmo se eu esperar 30 segundos depois que o mapa aparecer. (somente o primeiro carregamento)

3
colesadam

Eu não acho que você possa colocar comentários XML dentro uma tag como você está fazendo com <!-- Definition -->. Se você remover isso, o problema ainda ocorre?

1
Matt

No meu caso, uma grande falta, eu esqueço de adicionar no arquivo gradle minha dependência do google map:

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

Obviamente, este é apenas um erro de verificação incorreta do Lint. Você pode removê-lo quando, na visualização de Problemas do Eclipse , clique com o botão direito do mouse na linha com o erro, selecione o Solução rápida e selecione, por exemplo Ignorar Verificação do projeto .

O erro desaparece, o projeto é construído e o aplicativo funciona perfeitamente bem.

0
Ridcully