Подтвердить что ты не робот

Android Google Maps фрагмент в xml. Я получаю "Неожиданный префикс пространства имен"

Я пытаюсь изучить Android и следуя инструкциям о том, как использовать API Карт Google V.2, я теперь получил его работу. Однако инструкции по настройке начального состояния карт, найденные в developers.google.com, предлагают пространство имен, определенное в xml файле, в этом случае "карта".

Ниже приведенный ниже xml-код дает сообщение об ошибке "Непредвиденный префикс пространства имен" карта ". Попытка определить xmlns: map внутри тега фрагмента дала ту же ошибку, но с" xmlns".

Мне явно не хватает фундаментального знания xml здесь, может кто-то мне помочь?

<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>
4b9b3361

Ответ 1

Вы должны сделать две вещи:

Во-первых: https://docs.google.com/document/pub?id=19nQzvKP-CVLd7_VrpwnHfl-AE9fjbJySowONZZtNHzw

Добавьте зависимость от Google Play Services в ваш проект

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

Второе: https://developers.google.com/maps/documentation/android/intro.

Выберите " Project > Properties, выберите " Java Build Path и перейдите к " Libraries. Выберите " Add External Jars файлы Jar", включите следующие файлы JAR и нажмите "ОК":

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

Теперь мой проект больше не показывает ошибок :)

Ответ 2

У меня тоже была эта проблема. Я сделал Project/Clean, и ошибка исчезла, и теперь она отлично работает.

Ответ 3

У меня такая же проблема сегодня. Вчера вечером я обновил SDK и раньше не видел этой проблемы. У меня также был загружен демонстрационный проект образца Android Map V2, и сегодня в файле "multimap_demo.xml" отображается ошибка "Неожиданный префикс пространства имен", найденный для ошибки "фрагмент тега". Я применил предложенный xml, и он снова работает. Дал бы ему +1, но не получил никакого доверия.

UPDATE: Я забыл об этой проблеме и переработал мой код сегодня и удалил include. Конечно, ошибка вернулась. Я нашел это и добавил его в макет в фрагментной строфе:

tools:ignore="MissingPrefix"

Похоже, что проблема маскируется.

Обновление: эта ошибка, по-видимому, происходит из-за ошибки в Android Lint Tool. См. Вопрос https://code.google.com/p/gmaps-api-issues/issues/detail?id=5002

Ответ 4

Существует еще одно обходное решение, позволяющее продолжить настройку всего в файлах макета вместо кода Java. Поскольку ошибка возникает только тогда, когда SupportMapFragment является дочерним элементом ViewGroup в файле макета, можно извлечь элемент <fragment> в свой собственный файл макета, а затем просто включить его в желаемый более крупный макет.

Например, если вы пытаетесь сделать это:

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>

Вместо этого вы можете разбить его так:

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>

Ответ 5

Ну, я знаю, это не решение проблемы с пространством имен, возможно, это может помочь.

Поскольку я не знаю никакого XML-решения, я сделал это программно:

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

Таким образом, карта Google инициализируется по умолчанию, но получает ее параметры непосредственно после этого кода.

Ответ 6

У меня точно такая же проблема. Приведенный пример

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

отлично работает, но если вы попытаетесь добавить его в родительский элемент, он откажется принять xmlns. Если вы переместите объявление xmlns в верхний элемент, он по-прежнему отказывается принять префикс карты в фрагменте:

Unexpected namespace prefix "map" found for tag fragment

Теперь, если вы расширяете SupportMapFragment и используете настраиваемое представление, например:

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

... тогда он не жалуется и результирующая карта верна. Однако для меня возникают дополнительные проблемы, поскольку нет достойных примеров того, как сделать это подклассирование, вы должны сделать больше, чем переопределить onCreateView, и когда я пытаюсь что-то сделать с картой, я получаю следующее

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

... даже если я жду 30 секунд после появления карты (только первая загрузка)

Ответ 7

Я не думаю, что вы можете помещать комментарии XML внутри тега, как вы делаете с <!-- Definition -->. Если вы удалите это, проблема все еще возникает?

Ответ 8

Очевидно, что это просто неверная ошибка проверки Lint. Вы можете удалить его, когда в представлении "Проблема Eclipse" щелкните правой кнопкой мыши строку с ошибкой, выберите параметр "Быстрая настройка" и выберите, например. Игнорировать Проверить проект.

Ошибка уходит, проект строится, и приложение работает отлично.

Ответ 9

В моем случае большой промах, я забыл добавить в файл gradle мою зависимость карты google:

compile 'com.google.android.gms:play-services-maps:11.2.0'