Имя SuportMapFragment не существует в текущем контексте. - PullRequest
0 голосов
/ 13 июля 2020

Я добавил карту в свое приложение, хотя и для одного вида. После создания нескольких макетов я хотел реализовать нижнее представление навигации, что означало, что мне пришлось использовать фрагменты. Я уже переместил код своей активности в свой фрагмент с именем map_fragment, сначала я не был уверен, где использовать FindFragmentById, но, согласно findViewById в фрагменте , это следует использовать в методе жизненного цикла OnCreateView (). Моя основная проблема сейчас заключается в захвате фрагмента карты, поскольку я получаю сообщение об ошибке Имя 'SuportMapFragment' не существует в текущем контексте при использовании

    var mapFragment = (SupportMapFragment)SupportFragmentManager.FindFragmentById(Resource.Id.gmap);
        // Was able to use FragmentManager, but it returns null...
    // var mapFragment = (SupportMapFragment)FragmentManager.FindFragmentById(Resource.Id.gmap);
        mapFragment.GetMapAsync(this);

Вот полный код

    public class map_fragment : Android.Support.V4.App.Fragment, IOnMapReadyCallback
    {
        public override void OnCreate(Bundle savedInstanceState)
            {
            base.OnCreate(savedInstanceState);
                // Create your fragment here       
        }
        public override void OnActivityCreated(Bundle savedInstanceState)
        {
            base.OnActivityCreated(savedInstanceState);
            // Capture the Map Fragment
        }
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            // Use this to return your custom view for this Fragment
            base.OnCreateView(inflater, container, savedInstanceState);

            View view = inflater.Inflate(Resource.Layout.activity_main, container, false);
            var mapFragment = (SupportMapFragment)SupportFragmentManager.FindFragmentById(Resource.Id.gmap);
            //var mapFragment = (SupportMapFragment)FragmentManager.FindFragmentById(Resource.Id.gmap);
            mapFragment.GetMapAsync(this);

            return view;
        }
        public void OnMapReady(GoogleMap _map)
        {
            // Some other code here
        }
}

По запросу это мой main_activity

   public class MainActivity : AppCompatActivity
    {
        BottomNavigationView bottomNavigation;
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
            // Initialize Xamarin Essentials for the Geolocation Service
            Xamarin.Essentials.Platform.Init(this, savedInstanceState);
            SetContentView(Resource.Layout.main_frame);
            //var toolbar = FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
            //if (toolbar != null)
            //{
            //    SetSupportActionBar(toolbar);
            //    SupportActionBar.SetDisplayHomeAsUpEnabled(false);
            //    SupportActionBar.SetHomeButtonEnabled(false);
            //}

            bottomNavigation = FindViewById<BottomNavigationView>(Resource.Id.bottom_navigation);

            bottomNavigation.NavigationItemSelected += BottomNavigation_NavigationItemSelected;

            // Load the first fragment on creation
            LoadFragment(Resource.Id.profile_view);

        }

        private void BottomNavigation_NavigationItemSelected(object sender, BottomNavigationView.NavigationItemSelectedEventArgs e)
        {
            LoadFragment(e.Item.ItemId);
        }

        void LoadFragment(int id)
        {
            Android.Support.V4.App.Fragment fragment = null;
            switch (id)
            {
                case Resource.Id.profile_view:
                    fragment = profile_fragment.NewInstance();
                    break;
                case Resource.Id.map_view:
                    fragment = map_fragment.NewInstance();
                    break;
            }

            if (fragment == null)
                return;

            SupportFragmentManager.BeginTransaction()
                .Replace(Resource.Id.content_frame, fragment)
                .Commit();
        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
        {
            Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);

            base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

Это учебные пособия, которые я использую в качестве руководства

1 Ответ

1 голос
/ 13 июля 2020

Поскольку вы используете SupportMapFragment в Fragment, вы можете назвать его так:

SupportMapFragment mapFragment = Activity.SupportFragmentManager.FindFragmentById(Resource.Id.gmap).JavaCast<SupportMapFragment>();    
 if (mapFragment == null)
    {
     mapFragment = SupportMapFragment.NewInstance();
     mapFragment.GetMapAsync(this);
    }

обратитесь к SupportMapFragment в вашем фрагменте xml:

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:id="@+id/gmap"
  class="com.google.android.gms.maps.SupportMapFragment" />

обновление (вот так мы могли бы обработать OnMapReady):

SupportMapFragment mapFragment = ChildFragmentManager.FindFragmentById(Resource.Id.gmap).JavaCast<SupportMapFragment>();    
mapFragment.GetMapAsync(this);
...