2013-08-02 4 views
0

Следующий код прекрасно работает в одной ориентации, но как только меняется ориентация он вызывает исключение:SupportMapFragment вызывает исключение на изменение ориентации

using Android.App; 
using Android.Content.PM; 
using Android.Gms.Maps; 
using Android.Gms.Maps.Model; 
using Android.OS; 
using Android.Support.V4.App; 
using Cirrious.MvvmCross.Droid.Fragging; 
using System; 
using System.Collections.Generic; 
using System.Drawing; 

namespace Demo.Droid.Views 
{ 
    [Activity(Label = "View for MapViewModel", Theme = "@android:style/Theme.NoTitleBar", ConfigurationChanges = ConfigChanges.Orientation)] 
    public class MapView : MvxFragmentActivity 
    { 
     private SupportMapFragment _mapFragment; 

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

      InitMapFragment(); 
     } 

     private void InitMapFragment() 
     { 
      _mapFragment = SupportFragmentManager.FindFragmentByTag("map") as SupportMapFragment; 
      if (_mapFragment == null) 
      { 
       GoogleMapOptions mapOptions = new GoogleMapOptions() 
        .InvokeMapType(GoogleMap.MapTypeNormal) 
        .InvokeZoomControlsEnabled(false) 
        .InvokeCompassEnabled(true); 

       FragmentTransaction fragTx = SupportFragmentManager.BeginTransaction(); 
       _mapFragment = SupportMapFragment.NewInstance(mapOptions); 

       fragTx.Add(Resource.Id.map, _mapFragment, "map"); 
       fragTx.Commit(); 
      } 
     } 
    } 
} 

Если я закомментируйте InitMapFragment в OnCreate то карта загружает и вращается правильно, поэтому, похоже, это что-то связано с SupportMapFragment.

Файл макета содержит:

<?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:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@android:color/white"> 
    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="0.1" 
     android:background="@drawable/nav_bar_background" 
     android:id="@+id/bartop"> 
    </RelativeLayout> 
    <fragment 
     class="com.google.android.gms.maps.SupportMapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="0.8" 
     android:id="@+id/map" /> 
    <RelativeLayout 
     android:orientation="horizontal" 
     android:minWidth="25px" 
     android:minHeight="25px" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="0.1" 
     android:id="@+id/barbottom" 
     android:layout_alignParentBottom="true" 
     android:background="@drawable/nav_bar_background"> 
    </RelativeLayout> 
</LinearLayout> 

Отладочный вывод только показывает "необработанное исключение произошло. но журнал устройство показывает:

android.view.InflateException: Binary XML file line #1: Error inflating class fragment 
(raw stack trace not found) 
Caused by: 
java.lang.IllegalStateException: Fragment com.google.android.gms.maps.SupportMapFragment did not create a view. 
+0

Зачем? – Cheesebaron

+0

InflateException on OnCreate. Я добавил дополнительные детали к вопросу. – Neil

ответ

1

Я до сих пор не уверен в причине ошибки, но изменение фрагмента к FrameLayout в XML, а затем добавить фрагмент программно фиксирует его.

using Android.App; 
using Android.Content.PM; 
using Android.Gms.Maps; 
using Android.Gms.Maps.Model; 
using Android.OS; 
using Android.Support.V4.App; 
using Cirrious.MvvmCross.Droid.Fragging; 
using System; 
using System.Collections.Generic; 
using System.Drawing; 

namespace Demo.Droid.Views 
{ 
    [Activity(Label = "View for MapViewModel", Theme = "@android:style/Theme.NoTitleBar", ConfigurationChanges = ConfigChanges.Orientation)] 
    public class MapView : MvxFragmentActivity 
    { 
     private SupportMapFragment _mapFragment; 

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

      _mapFragment = new SupportMapFragment(); 
      var fragmentTx = this.SupportFragmentManager.BeginTransaction(); 
      fragmentTx.Add(Resource.Id.mapFrame, _mapFragment); 
      fragmentTx.Commit(); 

      SetContentView(Resource.Layout.MapView); 
     } 
    } 
} 

с файлом верстки:

<?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:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@android:color/white"> 
    <RelativeLayout 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="0.1" 
     android:background="@drawable/nav_bar_background" 
     android:id="@+id/bartop"> 
    </RelativeLayout> 
    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="0.8" 
     android:id="@+id/mapFrame" /> 
    <RelativeLayout 
     android:orientation="horizontal" 
     android:minWidth="25px" 
     android:minHeight="25px" 
     android:layout_width="fill_parent" 
     android:layout_height="0dp" 
     android:layout_weight="0.1" 
     android:id="@+id/barbottom" 
     android:layout_alignParentBottom="true" 
     android:background="@drawable/nav_bar_background"> 
    </RelativeLayout> 
</LinearLayout> 
0

Вы не можете надуть макет в виде фрагмента, когда этот макет включает в себя фрагмент. Вложенные фрагменты поддерживаются только при динамическом добавлении к фрагменту. Так что добавьте фрагмент программно.

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