如何在android xamarin中将onLocationChange的值设置为oncreate?
我正在开发xamarin android应用程序。我试图在oncreate方法中获取纬度、经度和cityname,以传递给服务。但我只在onlocation更改方法中获取这些值,而无法在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
谢谢
名称空间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());
}
}
}