0

次のコードは、単一の向きでは問題なく動作しますが、向きが変わるとすぐに例外が発生します。

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();
            }
        }
    }
}

OnCreate で InitMapFragment をコメント アウトすると、マップが正しく読み込まれ、回転するため、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.
4

2 に答える 2

1

エラーの原因はまだわかりませんが、フラグメントを XML で FrameLayout に変更し、フラグメントを追加するとプログラムで修正されます。

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>
于 2013-09-05T08:41:30.123 に答える