xml 中的 Android 谷歌地图片段。我得到“意外的命名空间前缀”
Posted
技术标签:
【中文标题】xml 中的 Android 谷歌地图片段。我得到“意外的命名空间前缀”【英文标题】:Android Google Maps fragment in the xml. I get "Unexpected namespace prefix" 【发布时间】:2013-02-08 02:03:21 【问题描述】:我正在尝试学习 android,并按照有关如何使用 Google Maps API V.2 的说明进行操作,现在我可以使用它了。 但是,在developers.google.com 中找到的有关如何配置映射初始状态的说明建议在 xml 文件中定义一个命名空间,在本例中为“map”。
下面的 xml 代码给出了错误 "Unexpected namespace prefix "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_
android:layout_>
<fragment
android:id="@+id/map"
android:layout_
android:layout_
class="com.google.android.gms.maps.SupportMapFragment"
map:cameraBearing="112.5"/> <!-- PROBLEM -->
</RelativeLayout>
【问题讨论】:
你应该清理项目,有时eclipse会犯愚蠢的错误。 【参考方案1】:你必须做两件事:
首先: https://docs.google.com/document/pub?id=19nQzvKP-CVLd7_VrpwnHfl-AE9fjbJySowONZZtNHzw
将对 Google Play 服务的依赖添加到您的项目中
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文件,点击OK:
<android-sdk-folder>/extras/android/compatibility/v4/android-support-v4.jar
现在我的项目不再显示错误了:)
【讨论】:
这是正确的解决方案。请注意,对于 Android Studio,将 google-play-services_lib 添加为模块依赖项。【参考方案2】:在我的情况下,我忘了在 gradle 文件中添加我的谷歌地图依赖项:
compile 'com.google.android.gms:play-services-maps:11.2.0'
【讨论】:
【参考方案3】:我遇到了完全相同的问题。提供的例子
<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_
android:layout_
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_
android:layout_
android:padding="5dp">
<com.google.android.gms.maps.MapView
android:id="@+id/map_view"
android:layout_
android:layout_
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 秒。(仅第一次加载)
【讨论】:
我们似乎确实坐在同一条船上。我继续在 java 代码中执行此操作。感谢您的回复,我将尝试自定义视图。 很有趣,如果您定义任何其他名称空间,它们似乎可以工作。就像我的上下文需要 xmlns:tools="schemas.android.com/tools" 一样。【参考方案4】:我今天也有同样的问题。我昨晚升级了SDK,之前没有看到这个问题。我也加载了 Android Map V2 示例演示项目,今天“multimap_demo.xml”文件显示“为标签片段找到意外的命名空间前缀“map””错误。我应用了建议的 xml 包含,它再次工作。会给它+1,但没有信誉。
更新: 我忘记了这个问题,今天重新编写了我的代码并删除了包含。当然错误又回来了。我找到了这个并将其添加到片段节中的布局中:
tools:ignore="MissingPrefix"
这似乎至少掩盖了问题。
更新:这个错误显然是由于 Android Lint Tool 中的错误而发生的。参考问题https://code.google.com/p/gmaps-api-issues/issues/detail?id=5002
【讨论】:
【参考方案5】:显然这只是一个误导性的 Lint 检查错误。当您在 Eclipse 的 Problem 视图 中右键单击出现错误的行,选择 Quick fix 选项并选择例如忽略对项目的检查。
错误消失,项目构建并且应用运行良好。
【讨论】:
【参考方案6】:我也有这个问题。我做了 Project/Clean,错误消失了,现在可以正常工作了。
【讨论】:
我只使用 eclipse for Android,我一直不明白为什么它不会自动清理。只有在您再次编辑 XML 文件然后问题再次出现之前,清理才有效 @Rob 您是否知道如何避免每次都出现错误。我必须一直打扫 @Snake 很遗憾没有,我最近没有用谷歌地图 API 做太多工作,所以我真的帮不上忙,抱歉。但是我确实切换到使用 Android Studio【参考方案7】:嗯,我知道,这并不是真正解决名称空间问题的方法,也许这可能会有所帮助。
由于我不知道任何 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);
所以谷歌地图是默认初始化的,但之后直接从代码中获取参数。
【讨论】:
【参考方案8】:还有另一种解决方法,可让您继续在布局文件中而不是在 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_
android:layout_>
<fragment
android:id="@+id/map"
android:layout_
android:layout_
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_
android:layout_
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_
android:layout_>
<include
android:id="@+id/map"
android:layout_
android:layout_
layout="@layout/include_map_fragment" />
</RelativeLayout>
【讨论】:
我仍然不断收到:'错误:在包 packagename 中找不到属性 xmlParam 的资源标识符'。奇怪的是,我记得 3-4 个月前将工作代码提交到我的 repo 并且几天前我尝试编译它时,我一直收到与原始海报相同的错误。【参考方案9】:我认为您不能像使用<!-- Definition -->
那样将 XML cmets 放入标签中。如果您删除它,问题仍然存在吗?
【讨论】:
是的,我后来添加了 cmets 以尝试解释问题。我还没有尝试过包含 cmets 的代码,你可能是对的。不过,感谢您抽出宝贵的时间!以上是关于xml 中的 Android 谷歌地图片段。我得到“意外的命名空间前缀”的主要内容,如果未能解决你的问题,请参考以下文章