【问题标题】:Xamarin Android, I want to activate a fragment of google map from an activity when a button is clicked on itXamarin Android,我想在单击按钮时从活动中激活谷歌地图的片段
【发布时间】:2017-02-20 22:12:54
【问题描述】:

我已经为一个问题工作了几天,但我还不能解决它。我需要帮助。当点击按钮时,我想从活动中激活谷歌地图的片段。

MainActivity Screenshot

MainActivity.cs 代码如下

using Android.App;
using Android.Content;
using Android.Widget;
using Android.OS;
using Android.Views;
using System;
using Android.Media;
using System.Json;
using System.Threading.Tasks;
using System.Net;
using Android.Locations;
using System.Collections.Generic;
using System.Linq;
using Java.Lang;
using Newtonsoft.Json;

namespace gpsCaution
{
    [Activity(Label = "gpsCaution", MainLauncher = true, Icon = "@drawable/gpsCaution")]
    public class MainActivity : Activity
    {
        ......
        some codes
        ......

        public static MainActivity Instance;
        protected override async void OnCreate(Bundle bundle) 
        {           
            base.OnCreate(bundle);
            Instance = this;
            SetContentView(Resource.Layout.Main);

            Button mbuttonShowMap = FindViewById<Button>(Resource.Id.buttonShowMap);

            mbuttonShowMap.Click += delegate
            {            
                StartActivity(typeof(Harita)); //** **It crashes here** **//
            };

        ......
        some codes
        ......
}

Main.axml 代码如下

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:minHeight="25px"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:paddingLeft="10dp"
    android:paddingTop="10dp"
    android:id="@+id/duzen">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/txtLocation"
        android:width="200dp"
        android:layout_alignParentRight="true" />
    <TextView
        android:text="Konumunuz:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView1"
        android:layout_toLeftOf="@id/txtLocation"
        android:layout_alignTop="@id/txtLocation"
        android:width="100dp"
        android:layout_alignParentLeft="true" />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/txtLocation"
        android:id="@+id/txtAddress"
        android:width="200dp"
        android:layout_alignParentRight="true" />
    <TextView
        android:text="Adresiniz:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView2"
        android:layout_toLeftOf="@id/txtAddress"
        android:layout_alignTop="@id/txtAddress"
        android:layout_below="@id/txtLocation"
        android:width="100dp"
        android:layout_alignParentLeft="true" />
    <TextView
        android:text=""
        android:layout_width="wrap_content"
        android:layout_height="85dp"
        android:id="@+id/textEmpty" />
    <ProgressBar
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_gravity="bottom"
        android:id="@+id/progressBar"
        android:visibility="invisible" />
    <Button
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Harita Görünümü"
        android:id="@+id/buttonShowMap"
        android:visibility="visible"
        android:layout_alignBottom="@id/progressBar"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="10px"
        android:layout_marginRight="20px" />
</RelativeLayout>

Harita.axml 代码如下

<?xml version="1.0" encoding="utf-8"?>
  <fragment xmlns:android="http://schemas.android.com/apk/res/android"
   android:id="@+id/googlemap"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   class="com.google.android.gms.maps.MapFragment"/>

Harita.cs 代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Gms.Maps;
using Android.Gms.Maps.Model;

namespace gpsCaution
{
    [Activity(Label = "Harita")]
    public class Harita :  Activity,IOnMapReadyCallback 
    {
        public void OnMapReady(GoogleMap googleMap)
        {
            MarkerOptions markerOptions = new MarkerOptions();
            markerOptions.SetPosition(new LatLng(16.03, 108));
            markerOptions.SetTitle("BABALAR");
            googleMap.AddMarker(markerOptions);

            //optional
            googleMap.UiSettings.ZoomControlsEnabled = true;
            googleMap.UiSettings.CompassEnabled = true;
            googleMap.MoveCamera(CameraUpdateFactory.ZoomIn());
        }       

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Harita);

            MapFragment mapFragment = (MapFragment)FragmentManager.FindFragmentById(Resource.Id.googlemap);
            mapFragment.GetMapAsync(this);
        }    

    }
}

最后AndroidManifest.xml代码如下

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="gpsCaution.gpsCaution" android:versionCode="1" android:versionName="1.0" android:installLocation="preferExternal">
    <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="23" />
    <application android:label="gpsCaution" android:icon="@drawable/gpsCaution"></application>
  <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.VIBRATE" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  <uses-permission android:name="android.permission.WRITE_GSERVICES" />
  <uses-permission android:name="com.google.providers.gsf.permission.READ_GSERVICES" />  
  <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />  
  <uses-permission android:name="gpsCaution.gpsCaution.MAPS_RECEIVE" android:protectionLevel="signature"/>
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-features android:glEsVersion="0x00020000" android:required="true" />  

  <application android:label="gpsCaution">   
    <meta-data android:name="com.google.android.geo.API_KEY" android:value="REMOVED" />
    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
  </application>      
</manifest>

我确信我的 google api 密钥是正确的,因为当我在 mainactivity 中编写代码而没有第二个活动时它可以工作。但是当我想在单击按钮时从主要活动中调用谷歌地图的片段时,我遇到了错误“未处理的异常: Android.Views.InflateException: Binary XML file line #1: Error inflating class fragment"

请帮忙,提前谢谢

【问题讨论】:

    标签: android dictionary android-activity xamarin fragment


    【解决方案1】:

    您使用了错误的函数来启动地图片段。请先在您的MyMapActivity 中创建一个地图片段容器,然后使用FragmentTransaction 将您的地图片段提交到容器中。

    试试下面的代码:

    在您的 MyMapActivity 中创建一个地图容器:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <FrameLayout
            android:id="@+id/map"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
    </LinearLayout>
    

    当您启动MyMapActivity 时,将您的地图片段提交到框架布局:

    public class MyMapActivity : Activity,IOnMapReadyCallback
    {  
        MapFragment _mapFragment;
        private GoogleMap _map;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            SetContentView(Resource.Layout.SecondActivity);
            InitMapFragment();
        }     
        private void InitMapFragment()
        {
            _mapFragment = FragmentManager.FindFragmentByTag("map") as MapFragment;
            if (_mapFragment == null)
            {
                GoogleMapOptions mapOptions = new GoogleMapOptions()
                    .InvokeMapType(GoogleMap.MapTypeSatellite)
                    .InvokeZoomControlsEnabled(false)
                    .InvokeCompassEnabled(true);
    
                FragmentTransaction fragTx = FragmentManager.BeginTransaction();
                _mapFragment = MapFragment.NewInstance(mapOptions);
                fragTx.Add(Resource.Id.map, _mapFragment, "map");
                fragTx.Commit();
            }
            _mapFragment.GetMapAsync(this);
        }
    
        public void OnMapReady(GoogleMap googleMap)
        {
            _map = googleMap;
        }
    }
    

    在您的MainActivity 中打开MyMapActivity

        private void Bt1_Click(object sender, System.EventArgs e)
        {
            StartActivity(typeof(MyMapActivity));
        }
    

    这是你的地图片段:

    <?xml version="1.0" encoding="utf-8"?>
    <fragment xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.google.android.gms.maps.MapFragment" />
    

    截图:

    GitHub source code

    【讨论】:

    • 那么我怎样才能添加一些标记,如果它很简单,位置?
    • @eunal 请参考这个demo 这会很有帮助
    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多