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>
Ответы
Ответ 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'