未处理的异常:Android.Views.InflateException:二进制XML文件行#1:二进制XML文件行#1:错误导致类片段发生

时间:2017-10-11 02:45:33

标签: android xml google-maps xamarin.android inflate-exception

我正在尝试将Google地图集成到Xamarin Android。但是,收到错误,如标题中所写。此错误出现在我的 SetContentView(Resource.Layout.Main); ,如下所示:

Error occurred in MainActivity.cs

我的地图Google Play服务最新。我已经尝试过清理和重建项目,重启VS也不适合我。非论坛回答了我的问题。

这些是我的项目中写的:

MainActivity.cs

using System;

using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using Android.Gms.Maps;

namespace Google_maps.Droid
{
    [Activity (Label = "@string/Google_maps.Android", MainLauncher = true, Icon = "@drawable/icon")] 
    public class MainActivity : Activity, IOnMapReadyCallback
    {
        private GoogleMap mMap;

        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);

            // Set our view from the "main" layout resource
            SetContentView (Resource.Layout.Main);
            SetUpMap();

        }

        private void SetUpMap()
        {
            if (mMap == null)
            {
                FragmentManager.FindFragmentById<MapFragment>(Resource.Id.map).GetMapAsync(this);
            }
        }

        public void OnMapReady(GoogleMap googleMap)
        {
            mMap = googleMap;
        }

    }
}

Main.axml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

  <fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="com.google.android.gms.maps.MapFragment"/>



</LinearLayout>

的strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="hello">Hello World, Click Me!</string>
    <string name="app_name">Google_maps.Android</string>
  <string name="google_maps_key">my_API_key</string>
  <string name="Google_maps.Android">Google maps</string>
</resources>

最后,

的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="Google_maps.google_mapsAndroid" android:installLocation="preferExternal">
  <uses-sdk android:minSdkVersion="15" />
  <application android:label="Google_maps.Android" android:icon="@drawable/Icon">
    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
    <meta-data android:name="com.google.android.maps.V2.API_KEY" android:value="@string/google_maps_key" />
  </application>
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
</manifest>

有关其他信息,我按照youtuber的方法, Joe Rock ,在那里他教我们如何设置谷歌地图。这是他视频的链接:

https://www.youtube.com/watch?v=W6Q0olRPsus

如果你向下看评论部分,你会发现许多其他人也有同样的问题。这段视频是 2年前制作的,所以我理解为什么它在目前的情况下不起作用。但是,我很感激,如果你们可以启发我将谷歌地图集成到我的Android移动应用程序的正确方法,如果不知何故,这种方法不再可靠。提前谢谢。

的问候, Xamarin和编程新手。

编辑:

当我将鼠标拖到SetContentView (Resource.layout.Main)时,它会显示 void Activity.SetContentView(int LayoutResID)(+2重载) 在布局资源上设置活动内容。

我应该关注这个吗?

3 个答案:

答案 0 :(得分:1)

所以我的项目无法打开,在必须重新创建我的项目的情况下,从头开始。我已经对我的模拟器进行了更改,我认为这可能一直是问题所在,并设法使其工作并删除标题上的错误。

虽然,目前唯一的问题是,它只在左下方显示“google”徽标,但没有地图。我应该在另一个帖子中写这个?由于它现在不同的情况。

但到目前为止,错误已被删除,我相信,设备和Android版本在这方面发挥了重要作用。

修改

您好,我已经设法让谷歌地图完全适用于我的应用。正如我之前所说,“设备和Android版本在开发应用程序中起着重要作用”。仅供参考,我使用的是Android 7.1版(Nougat),Nexus 5设备,Google API x86 - API 25.

  1. 在属性&gt;&gt;中将编译器设置为8.0(Oreo)在属性&gt;&gt;中使用“使用SDK版本编译”的应用程序和目标Android Manifest。

  2. Xamarin Inc.将 NuGet程序包管理器更新您的GoogleMaps程序包,在工具中更新为最新稳定版。我目前最新的稳定版本是42.1021.1。

  3. 将Xamarin Inc.的Xamarin.Android.Support.Compat从 Nuget Package Manager 更新,工具中的最新稳定版< / strong>即可。我目前最新的稳定版本是26.0.2。如果片段库没有随此更新,只需手动更新。

  4. 我添加了可能缺少的权限,如下所示:

  5. <permission android:name="googleMapsProject.googleMapsProject.droid.permission.MAPS_RECEIVE" android:protectionLevel="signature" />
    	<uses-permission android:name="com.deg.blubcnmobl.droid.permission.MAPS_RECEIVE" />

    仅供参考:googleMapsProject.googleMapsProject是您的包名称。确保它不以大写字母开头,并与您在Google控制台的密钥限制页面中写入的软件包名称匹配。

    1. 这一切都在谷歌地图API的v2上运行。
    2. 这就是我的工作方式。希望这有帮助!

答案 1 :(得分:0)

尝试:

变化:

  <fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:name="com.google.android.gms.maps.MapFragment"/>

要:

   <fragment
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.google.android.gms.maps.SupportMapFragment"/> 

另外,在你的SetUpMap()方法改变如下:

FragmentManager.FindFragmentById<MapFragment>(Resource.Id.map).GetMapAsync(this);

有:

SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);

答案 2 :(得分:0)

1.从Nuget安装Appcompact dll

2.使用AppCompatActivity而不是Activity

3.在您的属性

下的AndroidManifest中添加以下权限
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.INSTALL_LOCATION_PROVIDER"/>
<uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>

4.在main.axml

中添加以下xml
<fragment
    android:id="@+id/map"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    class="com.google.android.gms.maps.MapFragment" />

5.在resources / values / styles下的styles.xml中添加以下代码:

<style name="MyTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="windowNoTitle">true</item>
<item name="windowActionBar">false</item>
<item name="colorPrimary">#FFCC01</item>
<item name="colorPrimaryDark">#E69D02</item>
<item name="colorControlHighlight">#FFCC01</item>
<item name="colorAccent">#D5012A</item>
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
</style>

 <style name="DrawerArrowStyle" 
  parent="@style/Widget.AppCompat.DrawerArrowToggle">
  <item name="spinBars">true</item>
  <item name="color">@color/colorRedText</item>
 </style>

<style name="MyTheme" parent="MyTheme.Base">
 </style>

6.通过在AndroidManifest.xml文件中添加以下行来将我的主题作为默认应用程序主题,您可以在项目的属性下找到当前android项目下面的行。

  <application android:label="YourAppName" android:theme="@style/MyTheme" android:hardwareAccelerated="true" android:largeHeap="true" android:icon="@drawable/YourAppIcon">

如果你不明白任何事情,你可以在这里查看:

https://developer.xamarin.com/guides/android/platform_features/maps_and_location/

同时检查您的AndroidSdk中是否有Google Play服务,您可以在VS-15工具的工具栏中找到它&gt; Android&gt; AndroidSdk 在Extras下安装Google Play服务。