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

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

Приведенный ниже xml-код выдает med ошибку "Неожиданный префикс пространства имен "map"". Попытка определить 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>

person Alex    schedule 22.02.2013    source источник
comment
Вы должны очистить проект, иногда затмение делает глупую ошибку.   -  person The Finest Artist    schedule 24.03.2013


Ответы (9)



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

person Kent    schedule 20.04.2013
comment
Я использую eclipse только для Android, я никогда не понимал, почему он не очищает себя автоматически. Очистка работает только до тех пор, пока вы снова не отредактируете файл XML, после чего проблема повторяется. - person Rob; 18.07.2013
comment
@ Роб, ты понял, как не получать ошибку каждый раз? Я должен чистить все время - person Snake; 28.11.2014
comment
@Snake, к сожалению, нет, в последнее время я мало работал с API карт Google, поэтому не могу помочь, извините. Однако я переключился на использование Android Studio - person Rob; 28.11.2014

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

ОБНОВЛЕНИЕ: я забыл об этой проблеме и сегодня переработал свой код и удалил файл include. Естественно ошибка вернулась. Я нашел это и добавил в макет в строфе фрагмента:

tools:ignore="MissingPrefix"

Это как минимум маскирует проблему.

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

person WigglyWorld    schedule 07.03.2013

Существует еще один обходной путь, который позволяет вам продолжать настраивать все в файлах макета, а не в коде 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>
person Scott W    schedule 07.03.2013
comment
Я все еще продолжаю получать: «ошибка: не найден идентификатор ресурса для атрибута {xmlParam} в пакете {packagename}». Странно то, что я помню, как 3-4 месяца назад зафиксировал рабочий код в своем репозитории, и когда я пытался его скомпилировать несколько дней назад, я продолжал получать ту же ошибку, что и исходный постер. - person Indrek Kõue; 20.04.2013

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

Поскольку я не знаю никакого 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 Map инициализируется по умолчанию, но получает свои параметры непосредственно после этого из кода.

person Tobias Reich    schedule 27.02.2013

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

<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 секунд после появления карты (только первая загрузка)

person colesadam    schedule 23.02.2013
comment
Кажется, мы действительно сидим в одной лодке. Я перешел к тому, чтобы делать это в java-коде. Спасибо за ответ, я попробую пользовательский вид. - person Alex; 24.02.2013
comment
И достаточно забавно, если вы определите любое другое пространство имен, они, похоже, будут работать. Например, мне нужен xmlns:tools=schemas.android.com/tools для моего контекста. - person Tobias Reich; 27.02.2013

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

person Matthew    schedule 22.02.2013
comment
Да, я добавил комментарии позже, чтобы попытаться объяснить проблему. Я не пробовал код с комментариями в нем, возможно, вы правы. Спасибо, что уделили время! - person Alex; 24.02.2013

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

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

person Ridcully    schedule 03.03.2014

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

compile 'com.google.android.gms:play-services-maps:11.2.0'
person Pablo Cegarra    schedule 29.09.2017