0

Я новичок в разработке MvvmCross, Xamarin и Android, и поэтому основой для моей разработки является модифицированная версия XPlatformMenus MvvmCross Sample ProjectКак загрузить (и получить доступ к настройке) GoogleMap в <fragment> в фрагменте макета, полученном из MvxFragment в MvvmCross

Возможно, я не могу успешно создать карту google для добавления простых позиционных маркеров (т. Е. Из-за отсутствия экспертной формулировки, получения доступа к экземпляру «GoogleMap», чтобы я мог добавить к нему экземпляры «MapMarker» и, возможно, настройте некоторые параметры карты, чтобы придать ей желаемое поведение).

Прежде чем пытаться получить доступ к карте Google и ввести метки, мой фрагмент фрагмента «fragment_asset_details» (или «Просмотр сведений об объекте в моем случае») успешно отобразил карту Google Android (полностраничный просмотр).

Ссылаясь на мои включенные фрагменты кода, вызов «FindFragmentById» возвращает значение «null» frag каждый раз. В отладке я вижу, что SupportFragment Manager знает о фрагментах макета, но фрагмент GoogleMap полностью отсутствует.

Некоторые общие (и непосредственно связанных с ними) являются следующие вопросы:

  1. Есть пример MvxFragment связанных GoogleMap «гнездования», что я пропустил?
  2. Должен ли я программно добавить фрагмент GoogleMap в контейнер фрагментов аналогично Getting a Reference to a GoogleMap in a fragment using Support Library v4?
  3. Я выбрал правильную точку в жизненном цикле фрагмента контейнера, чтобы успешно достичь желаемого результата?

Я буду рад добавить любые запрошенные детали, это сообщение (изначально) было ограничено теми элементами моего прототипа, которые, я думаю, скорее всего связаны с проблемой, с которой я сталкиваюсь.

пакеты, Config для моего приложения (чтобы указать, в частности, при условии версии MvvmCross):

<packages> 
    <package id="Microsoft.Bcl" version="1.1.10" targetFramework="monoandroid60" /> 
    <package id="Microsoft.Bcl.Build" version="1.0.21" targetFramework="monoandroid60" /> 
    <package id="Microsoft.Net.Http" version="2.2.29" targetFramework="monoandroid60" /> 
    <package id="modernhttpclient" version="2.4.2" targetFramework="monoandroid60" /> 
    <package id="MvvmCross" version="4.2.3" targetFramework="monoandroid60" /> 
    <package id="MvvmCross.Binding" version="4.2.3" targetFramework="monoandroid60" /> 
    <package id="MvvmCross.Core" version="4.2.3" targetFramework="monoandroid60" /> 
    <package id="MvvmCross.Droid.FullFragging" version="4.2.3" targetFramework="monoandroid60" /> 
    <package id="MvvmCross.Droid.Shared" version="4.2.3" targetFramework="monoandroid60" /> 
    <package id="MvvmCross.Droid.Support.V4" version="4.2.3" targetFramework="monoandroid60" /> 
    <package id="MvvmCross.Droid.Support.V7.AppCompat" version="4.2.3" targetFramework="monoandroid60" /> 
    <package id="MvvmCross.Droid.Support.V7.RecyclerView" version="4.2.3" targetFramework="monoandroid60" /> 
    <package id="MvvmCross.Platform" version="4.2.3" targetFramework="monoandroid60" /> 
    <package id="MvvmCross.Plugin.Json" version="4.2.3" targetFramework="monoandroid60" /> 
    <package id="MvvmCross.Plugin.Messenger" version="4.2.3" targetFramework="monoandroid60" /> 
    <package id="MvvmCross.Plugin.Visibility" version="4.2.3" targetFramework="monoandroid60" /> 
    <package id="Newtonsoft.Json" version="9.0.1" targetFramework="monoandroid60" /> 
    <package id="Xamarin.Android.Support.Animated.Vector.Drawable" version="23.4.0.1" targetFramework="monoandroid60" /> 
    <package id="Xamarin.Android.Support.Design" version="23.4.0.1" targetFramework="monoandroid60" /> 
    <package id="Xamarin.Android.Support.v4" version="23.4.0.1" targetFramework="monoandroid60" /> 
    <package id="Xamarin.Android.Support.v7.AppCompat" version="23.4.0.1" targetFramework="monoandroid60" /> 
    <package id="Xamarin.Android.Support.v7.CardView" version="23.4.0.1" targetFramework="monoandroid60" /> 
    <package id="Xamarin.Android.Support.v7.RecyclerView" version="23.4.0.1" targetFramework="monoandroid60" /> 
    <package id="Xamarin.Android.Support.Vector.Drawable" version="23.4.0.1" targetFramework="monoandroid60" /> 
    <package id="Xamarin.GooglePlayServices.Base" version="29.0.0.2" targetFramework="monoandroid60" /> 
    <package id="Xamarin.GooglePlayServices.Basement" version="29.0.0.2" targetFramework="monoandroid60" /> 
    <package id="Xamarin.GooglePlayServices.Maps" version="29.0.0.2" targetFramework="monoandroid60" /> 
</packages> 

Схема для "fragment_asset_details.axml" MvxFragment выглядит следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 
    <include 
     layout="@layout/toolbar_actionbar" /> 
    <fragment 
     android:id="@+id/asset_map" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     class="com.google.android.gms.maps.SupportMapFragment" /> 
    </LinearLayout> 

Я определил фрагмент «AssetDetailsFragment» следующим образом:

using Android.App; 
using Android.Gms.Maps; 
using Android.Gms.Maps.Model; 
using Android.OS; 
using Android.Runtime; 
using Android.Views; 
using MyApp.Core.ViewModels.Base; 
using MyApp.Core.ViewModels.Assets; 
using MyApp.Droid.Utilities; 
using MvvmCross.Droid.Shared.Attributes; 

namespace MyApp.Droid.Fragments 
{ 
    [MvxFragment(typeof(MainViewModel), Resource.Id.content_frame)] 
    [Register("myapp.droid.fragments.AssetDetailsFragment")] 
    public class AssetDetailsFragment : BaseFragment<AssetDetailsViewModel> 
    { 
     private Marker _assetMarker; 

     private GoogleMap _asset_map; 

     public bool SetUpGoogleMap(int resourceId) 
     { 
      if (null != _loco_map) return false; 

      if (FragmentManager != null) 
      { 
       var frag = (SupportMapFragment) base.Activity.SupportFragmentManager.FindFragmentById(resourceId); 
       var mapReadyCallback = new OnMapReadyClass(); 

       mapReadyCallback.MapReadyAction += delegate (GoogleMap googleMap) 
       { 
        _asset_map = googleMap; 
       }; 

       if (frag != null) frag.GetMapAsync(mapReadyCallback); 
      } 
      return true; 
     } 

     public override void OnCreate(Bundle savedInstanceState) 
     { 
      base.OnCreate(savedInstanceState); 

      if (SetUpGoogleMap(Resource.Id.asset_map)) 
      { 
       var viewModel = (AssetDetailsViewModel)ViewModel; 
       var options = new MarkerOptions(); 
       options.SetPosition(new LatLng(viewModel.AssetDetails.latitude, 
        viewModel.AssetDetails.longitude)); 
       options.SetTitle(viewModel.Asset.name); 
       _assetMarker = _asset_map.AddMarker(options); 
      } 
     } 

     public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
     { 
      ShowHamburgerMenu = true; 
      var result = base.OnCreateView(inflater, container, savedInstanceState); 

      return result; 
     } 

     protected override int FragmentId => Resource.Layout.fragment_asset_details; 
    } 
} 

ответ

0

Попытка загрузить его через код:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:local="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/main_content" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 
    <include 
     layout="@layout/toolbar_actionbar" /> 
    <FrameLayout 
     android:id="@+id/map_frame" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@android:color/transparent" /> 
    </LinearLayout> 

В методе OnCreateView вашего фрагмента:

var supportMapFragment = SupportMapFragment.NewInstance(); 
var supportMapFragment.GetMapAsync(this); 

var ft = SupportFragmentManager.BeginTransaction(); 
ft.Add(Resource.Id.map_frame, supportMapFragment, typeof(SupportMapFragment).Name); 
ft.Commit(); 

Вам нужно будет реализовать IOnMapReadyCallback на вашем фрагменте, который обеспечит метод GetMapAsync(..).

 Смежные вопросы

  • Нет связанных вопросов^_^