Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android xamarin中将onLocationChange的值设置为oncreate?_Android_Xamarin - Fatal编程技术网

如何在android xamarin中将onLocationChange的值设置为oncreate?

如何在android xamarin中将onLocationChange的值设置为oncreate?,android,xamarin,Android,Xamarin,我正在开发xamarin android应用程序。我试图在oncreate方法中获取纬度、经度和cityname,以传递给服务。但我只在onlocation更改方法中获取这些值,而无法在oncreate中获取这些值以传递给服务 有人能帮我解决这个问题吗? 谢谢 名称空间Myapp { [活动(Label=“Test”)] 类测试:AppCompativeActivity,ILocationListener { 职位经理职位经理; string tag=“Test”; 私有Android.Supp

我正在开发xamarin android应用程序。我试图在oncreate方法中获取纬度、经度和cityname,以传递给服务。但我只在onlocation更改方法中获取这些值,而无法在oncreate中获取这些值以传递给服务

有人能帮我解决这个问题吗?
谢谢

名称空间Myapp
{
[活动(Label=“Test”)]
类测试:AppCompativeActivity,ILocationListener
{
职位经理职位经理;
string tag=“Test”;
私有Android.Support.V7.Widget.Toolbar mToolBar;
私人回收视图mRecyclerView;
private RecyclerView.LayoutManager MLLayoutManager;
私用MyAdapter mAdapter;
公共静态字符串纬度=null;
公共静态字符串经度=null;
公共静态字符串cityname=null;
受保护的异步重写void OnCreate(捆绑包)
{
base.OnCreate(bundle);
SetContentView(Android.Resource.Layout.test);
mToolBar=findviewbyd(Android.Resource.Id.toolbar);
设置支持操作栏(mToolBar);
SupportActionBar.Title=“测试”;
添加标志(WindowManagerFlags.DrawsSystemBarBackgrounds);
mRecyclerView=findviewbyd(Android.Resource.Id.testing);
mLayoutManager=新的LinearLayoutManager(此);
mRecyclerView.SetLayoutManager(mllayoutmanager);
ProgressDialog进度=新建ProgressDialog(此);
进程。不确定=真;
progress.SetProgressStyle(ProgressDialogStyle.Spinner);
progress.SetMessage(“正在联系服务器,请稍候…”);
进度。可设置可取消(false);
progress.Show();
locMgr=GetSystemService(Context.LocationService)作为LocationManager;
if(locMgr.AllProviders.Contains)(LocationManager.NetworkProvider)
&&LocationManager.IsProviderEnabled(LocationManager.NetworkProvider))
{
LocationManager.RequestLocationUpdate(LocationManager.NetworkProvider,2000,1,本);
}
其他的
{
Toast.MakeText(这是“网络提供程序不存在或未启用!”,ToastLength.Long.Show();
}
**在这里,我需要将纬度、经度和城市名称传递给我的服务。**
进步。解散();
mAdapter=newmyadapter(Count,mRecyclerView,this);
//mAdapter.ItemClick+=OnItemClick;
mRecyclerView.SetAdapter(mAdapter);
}
}
公共异步void GetAddress()
{
Geocoder Geocoder=新的Geocoder(本);
IList addressList=await geocoder.GetFromLocationAsync(Convert.ToDouble(纬度),Convert.ToDouble(经度),10);
Address=addressList.FirstOrDefault();
if(地址!=null)
{
StringBuilder deviceAddress=新StringBuilder();
对于(int i=0;i
与桌面编程不同,在Android上,您无法处理应用程序的生命周期步骤。您只需在生命周期中发生更改时得到通知并在那里进行处理。简而言之,获取最新位置的唯一方法是等待调用onLocationChanged


我的建议是要么用onLocationChanged方法启动服务,要么启动服务,然后在调用onLocationChanged时,将位置告知服务。或者您的服务可以是LocationListener并绕过那里的通信。

下面是我编写的一个简单示例的链接,该示例演示如何在OnCreate中发出位置请求,然后在OnLocationChanged中获得结果。您已经有了属于类成员的经度和纬度变量。您可以在OnLocationChanged中设置这些变量,但是需要从OnLocationChanged调用使用这些值执行操作的代码


如果您将
 namespace Myapp
    {
        [Activity(Label = "Test")]
        class Test: AppCompatActivity, ILocationListener
        {

            LocationManager locMgr;

            string tag = "Test";

            private Android.Support.V7.Widget.Toolbar mToolBar;
            private RecyclerView mRecyclerView;
            private RecyclerView.LayoutManager mLayoutManager;
            private MyAdapter mAdapter;


            public static string latitude = null;
            public static string longitude = null;
            public static string cityname = null;



            protected async override void OnCreate(Bundle bundle)
            {
                base.OnCreate(bundle);
                SetContentView(Android.Resource.Layout.test);
                mToolBar = FindViewById<Android.Support.V7.Widget.Toolbar>(Android.Resource.Id.toolbar);
                SetSupportActionBar(mToolBar);
                SupportActionBar.Title = "Test";
                Window.AddFlags(WindowManagerFlags.DrawsSystemBarBackgrounds);
                mRecyclerView = FindViewById<RecyclerView>(Android.Resource.Id.testing);

               mLayoutManager = new LinearLayoutManager(this);
                mRecyclerView.SetLayoutManager(mLayoutManager);


                ProgressDialog progress = new ProgressDialog(this);
                progress.Indeterminate = true;
                progress.SetProgressStyle(ProgressDialogStyle.Spinner);
                progress.SetMessage("Contacting server. Please wait...");
                progress.SetCancelable(false);
                progress.Show();


                locMgr = GetSystemService(Context.LocationService) as LocationManager;


                if (locMgr.AllProviders.Contains(LocationManager.NetworkProvider)
                    && locMgr.IsProviderEnabled(LocationManager.NetworkProvider))
                {
                    locMgr.RequestLocationUpdates(LocationManager.NetworkProvider, 2000, 1, this);
                }
                else
                {
                    Toast.MakeText(this, "The Network Provider does not exist or is not enabled!", ToastLength.Long).Show();
                }

    **Here I need to pass the latitude, longitude and city name to my service.**       

                  progress.Dismiss();



                    mAdapter = new MyAdapter(Count, mRecyclerView, this);
                    //  mAdapter.ItemClick += OnItemClick;
                    mRecyclerView.SetAdapter(mAdapter);
                }



            }


            public async void GetAddress()
            {
                Geocoder geocoder = new Geocoder(this);
                IList<Address> addressList = await geocoder.GetFromLocationAsync(Convert.ToDouble(latitude), Convert.ToDouble(longitude), 10);

                Address address = addressList.FirstOrDefault();
                if (address != null)
                {
                    StringBuilder deviceAddress = new StringBuilder();
                    for (int i = 0; i < address.MaxAddressLineIndex; i++)
                    {
                        deviceAddress.Append(address.GetAddressLine(i))
                                     .AppendLine(",");
                    }

                    cityname = address.GetAddressLine(1);
                 //   Toast.MakeText(this, address.GetAddressLine(1), ToastLength.Long).Show();
                }
                else
                {
                   // _addressText.Text = "Unable to determine the address.";

                }
            }


            public void OnLocationChanged(Android.Locations.Location location)
            {
              //  Log.Debug(tag, "Location changed");
             //   latitude.Text = "Latitude: " + location.Latitude.ToString();
             //   longitude.Text = "Longitude: " + location.Longitude.ToString();
             //   provider.Text = "Provider: " + location.Provider.ToString();


                latitude = location.Latitude.ToString();
                longitude = location.Longitude.ToString();

                GetAddress();

             //   String[] s = cityname.Split(',');



            }
            public void OnProviderDisabled(string provider)
            {
                Log.Debug(tag, provider + " disabled by user");
            }
            public void OnProviderEnabled(string provider)
            {
                Log.Debug(tag, provider + " enabled by user");
            }
            public void OnStatusChanged(string provider, Availability status, Bundle extras)
            {
                Log.Debug(tag, provider + " availability has changed to " + status.ToString());
            }





        }
    }