Fragment inside of a DialogFragment c# android

本文关键字:android DialogFragment inside of Fragment | 更新日期: 2023-09-27 18:09:35

我在我的DialogFragment中添加一个片段(它将保留一个google地图)有一些问题。在我的DialogFragment中,我有一个像这样设置的框架布局

    <FrameLayout
        android:id="@+id/fragment"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:name="com.google.android.gms.maps.MapFragment"/>

正在设置DialogFragment并试图添加映射的c#代码是。我还指定了IOnMapReadyCallback与类。

         using Android.App;
using Android.OS;
using Android.Views;
using Android.Widget;
using Android.Graphics;
using Android.Gms.Maps;
using System;
using Android.Gms.Maps.Model;
namespace My_Town_App.Droid
{
    class dialog_preview_busn : DialogFragment
    {
        public string gName, gAddress, gNumber, gEmail, gWebsite, gHours, gImage;
        public int gZip;
        private GoogleMap gMap;
        public dialog_preview_busn(string Name, string Address, int Zip, string Number, string Email, string Website, string Hours, string Image)
        {
            gName = Name;
            gAddress = Address;
            gZip = Zip;
            gNumber = Number;
            gEmail = Email;
            gWebsite = Website;
            gHours = Hours;
            gImage = Image;
            System.Diagnostics.Debug.Write("-----------------");
            System.Diagnostics.Debug.Write("dialog_preview_busn");
            System.Diagnostics.Debug.Write("-----------------");
            System.Diagnostics.Debug.Write("Name: " + Name + "   Address: " + Address + "    Zip: " + Zip + "    Number: " + Number);
            System.Diagnostics.Debug.Write("Email: " + Email + "    Website: " + Website + "    Hours: " + Hours + "    Image: " + Image);
            //gOnLogInComplete.Invoke(this, new OnLogInEventArgs(gtxtEmail.Text, gtxtPassword.Text));
            //PassedParams.Invoke(this, new PassedParams(user, pass));
        }
        //----------------------------------------
        // OnCreate Activity
        //----------------------------------------
        public override void OnActivityCreated(Bundle savedInstanceState)
        {
            Dialog.Window.RequestFeature(WindowFeatures.NoTitle); //Set the Title Bar to invisable
            base.OnActivityCreated(savedInstanceState);
            TextView txtName = View.FindViewById<TextView>(Resource.Id.txtName);
            TextView txtAdress = View.FindViewById<TextView>(Resource.Id.txtAddress);
            TextView txtNumber = View.FindViewById<TextView>(Resource.Id.txtNumber);
            TextView txtEmail = View.FindViewById<TextView>(Resource.Id.txtEmail);
            TextView txtWebsite = View.FindViewById<TextView>(Resource.Id.txtWebsite);
            TextView txtHours = View.FindViewById<TextView>(Resource.Id.txtHours);
            TextView labHours = View.FindViewById<TextView>(Resource.Id.labHours);
            ImageView downArrow = View.FindViewById<ImageView>(Resource.Id.downArrow);
            LinearLayout mapLayout = View.FindViewById<LinearLayout>(Resource.Id.mapLayout);
            mapLayout.Visibility = ViewStates.Gone;
            SetUpMap();
            downArrow.Click += delegate
            {
                System.Diagnostics.Debug.Write("down arrow is working");
                if (mapLayout.Visibility == ViewStates.Visible)
                {
                    downArrow.SetImageResource(Resource.Drawable.menu_down_arrow);
                    mapLayout.Visibility = ViewStates.Gone;
                }
                else if (mapLayout.Visibility == ViewStates.Gone)
                {
                    downArrow.SetImageResource(Resource.Drawable.menu_up_arrow);
                    mapLayout.Visibility = ViewStates.Visible;
                }
            };
            txtName.Text = gName;
            txtName.PaintFlags = PaintFlags.UnderlineText;
            txtAdress.Text = (gAddress + " " + gZip).ToString();
            txtNumber.Text = gNumber;
            txtEmail.Text = gEmail;
            txtWebsite.Text = gWebsite;
            string[] aryHours = gHours.Split(',');
            foreach (string s in aryHours)
            {
                txtHours.Text += (s + " ").ToString();
            }
            labHours.PaintFlags = PaintFlags.UnderlineText;
            Dialog.Window.Attributes.WindowAnimations = Resource.Style.dialog_animation; //set the animation
        }
        //----------------------------------------
        // OnCreate View
        //----------------------------------------
        public override View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
        {
            base.OnCreateView(inflater, container, savedInstanceState);
            var view = inflater.Inflate(Resource.Layout.dialog_preview_busn, container, false);
            return view;
        }
        private void SetUpMap()
        {
            if (gMap == null)
            {
                FragmentManager.FindFragmentById<MapFragment>(Resource.Id.fragment);
            }

            LatLng location = new LatLng(50.897778, 3.013333);
            CameraPosition.Builder builder = CameraPosition.InvokeBuilder();
            builder.Target(location);
            builder.Zoom(18);
            builder.Bearing(155);
            builder.Tilt(65);
            CameraPosition cameraPosition = builder.Build();
            CameraUpdate cameraUpdate = CameraUpdateFactory.NewCameraPosition(cameraPosition);
            MapFragment mapFrag = (MapFragment)FragmentManager.FindFragmentById<MapFragment>(Resource.Id.fragment);
            GoogleMap map = mapFrag.Map;
            if (map != null)
            {
                map.MoveCamera(cameraUpdate);
            }
        }        
        public void OnMapReady(GoogleMap googleMap)
        {
            gMap = googleMap;
        }
    }
}

任何帮助,这将是非常感激!

Fragment inside of a DialogFragment c# android

你的函数'SetUpMap'应该是异步的。什么时候是你的功能'OnMapReady'被调用?你把它和某个事件联系起来了吗?当事件被触发时,你必须重新加载布局