如何从另一个项目开始 Activity
How to start Activity from another project
我正在为 android 和 windows-phone 开发天气应用程序。所以我在"Weather.Api(Portable)"中的另一个项目中写了公共代码在"Parsing Class"中。 "Weather.Droid" 用于 Android.
ParsingClass代码如下:
public static string tempGlobal;
public static string cityTextGlobal;
private static string GovnoTemperature;
public async Task<string> dataByCity(string city)
{
var url = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "&units=metric&APPID="+AppID;
//ТОРМОЗИТ ЗДЕСЬ / BRAKES HERE
await FetchAsync(url);
return city;
}
public async Task<double> Data_down(double lat, double lon)
{
var url = String.Format(
"http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "&units=metric&APPID=" + AppID);
//ТОРМОЗИТ ЗДЕСЬ / BRAKES HERE
await FetchAsync(url);
return lat;
}
public async Task<string> FetchAsync(string url)
{
string jsonString;
using (var httpClient = new System.Net.Http.HttpClient())
{
var stream = await httpClient.GetStreamAsync(url);
StreamReader reader = new StreamReader(stream);
jsonString = reader.ReadToEnd();
}
var json = jsonString;
JsonValue firstitem = json;
var mydata = JObject.Parse(json);
cityTextGlobal = (mydata["name"]).ToString();
string GovnoData = (mydata["main"]).ToString();
//spliting string
string[] values = GovnoData.Split(',');
for (int i = 0; i < values.Length; i++)
{
values[i] = values[i].Trim();
if (i == 0)
{
//tempGlobal = values[i];
GovnoTemperature = values[i];
}
}
tempGlobal = null;
foreach (char c in GovnoTemperature)
{
if (c == '.')
{
break;
}
if (c == '-' || char.IsDigit(c) == true || c == '.')
{
tempGlobal += c.ToString();
}
}
return jsonString;
}
}
public class Coord
{
public double lon { get; set; }
public double lat { get; set; }
}
public class Weather
{
public int id { get; set; }
public string main { get; set; }
public string description { get; set; }
public string icon { get; set; }
}
public class Main
{
public double temp { get; set; }
public int pressure { get; set; }
public int humidity { get; set; }
public int temp_min { get; set; }
public int temp_max { get; set; }
}
public class Wind
{
public double speed { get; set; }
public double deg { get; set; }
}
public class Clouds
{
public int all { get; set; }
}
public class Sys
{
public int type { get; set; }
public int id { get; set; }
public double message { get; set; }
public string country { get; set; }
public int sunrise { get; set; }
public int sunset { get; set; }
}
public class RootObject
{
public Coord coord { get; set; }
public List<Weather> weather { get; set; }
public string @base { get; set; }
public Main main { get; set; }
public int visibility { get; set; }
public Wind wind { get; set; }
public Clouds clouds { get; set; }
public int dt { get; set; }
public Sys sys { get; set; }
public int id { get; set; }
public string name { get; set; }
public int cod { get; set; }
}
}
我需要从以下方法启动 "Weather.Droid" 的 MainActivity:
public async Task FetchAsync(string url)
之前returns:
jsonString
我该怎么做?
看来你追求的是依赖注入。在可移植项目中声明一个接口,然后在Droid/iOS/???您支持的项目。
我在 XLabs 社区项目中创建了 IOC 的抽象。 Matt Whetton 写了一些关于如何使用它的非常好的说明:http://www.codenutz.com/getting-started-xamarin-forms-labs-xaml-mvvm-ioc/
以下方法并不理想,但有点不清楚为什么您需要调用 activity 开始至少这会给您一些想法。
便携端:
public class Class1
{
public static async Task<string> Fetch(string url, Action onComplete = null)
{
await Task.Delay(10);
onComplete?.Invoke();
return url;
}
}
在 Android 方面(如果您打算在主屏幕出现之前执行此提取,这将是您的初始屏幕或应用程序):
[Activity(Label = "App5", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
Class1.Fetch("test", () =>
{
var intent = new Intent(this, typeof(OtherActivity));
this.RunOnUiThread(() => StartActivity(intent));
}).ContinueWith(t =>
{
if (t.IsCompleted) Log.Debug("Fetch", t.Result);
});
}
}
I need to start MainActivity of "Weather.Droid" from method:
public async Task FetchAsync(string url)
您不能直接从 Droid 项目启动 MainActivity。但正如@SKall 所说,您可以在 FetchAsync
方法中使用 Action<Intent>
:
//add Action<Intent> as and Intent as parameters
public async Task<string> FetchAsync(string url,Action<Intent> navigationFunc,Intent intent)
{
string jsonString;
...
navigationFunc(intent);//Invoke the action
return jsonString;
}
然后在您的 Droid 项目中使用它:
ParsingClass parsing = new ParsingClass();
Intent intent = new Intent(this, typeof(MainActivity));
await parsing.FetchAsync("url", StartActivity, intent);
我正在为 android 和 windows-phone 开发天气应用程序。所以我在"Weather.Api(Portable)"中的另一个项目中写了公共代码在"Parsing Class"中。 "Weather.Droid" 用于 Android.
ParsingClass代码如下:
public static string tempGlobal;
public static string cityTextGlobal;
private static string GovnoTemperature;
public async Task<string> dataByCity(string city)
{
var url = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "&units=metric&APPID="+AppID;
//ТОРМОЗИТ ЗДЕСЬ / BRAKES HERE
await FetchAsync(url);
return city;
}
public async Task<double> Data_down(double lat, double lon)
{
var url = String.Format(
"http://api.openweathermap.org/data/2.5/weather?lat=" + lat + "&lon=" + lon + "&units=metric&APPID=" + AppID);
//ТОРМОЗИТ ЗДЕСЬ / BRAKES HERE
await FetchAsync(url);
return lat;
}
public async Task<string> FetchAsync(string url)
{
string jsonString;
using (var httpClient = new System.Net.Http.HttpClient())
{
var stream = await httpClient.GetStreamAsync(url);
StreamReader reader = new StreamReader(stream);
jsonString = reader.ReadToEnd();
}
var json = jsonString;
JsonValue firstitem = json;
var mydata = JObject.Parse(json);
cityTextGlobal = (mydata["name"]).ToString();
string GovnoData = (mydata["main"]).ToString();
//spliting string
string[] values = GovnoData.Split(',');
for (int i = 0; i < values.Length; i++)
{
values[i] = values[i].Trim();
if (i == 0)
{
//tempGlobal = values[i];
GovnoTemperature = values[i];
}
}
tempGlobal = null;
foreach (char c in GovnoTemperature)
{
if (c == '.')
{
break;
}
if (c == '-' || char.IsDigit(c) == true || c == '.')
{
tempGlobal += c.ToString();
}
}
return jsonString;
}
}
public class Coord
{
public double lon { get; set; }
public double lat { get; set; }
}
public class Weather
{
public int id { get; set; }
public string main { get; set; }
public string description { get; set; }
public string icon { get; set; }
}
public class Main
{
public double temp { get; set; }
public int pressure { get; set; }
public int humidity { get; set; }
public int temp_min { get; set; }
public int temp_max { get; set; }
}
public class Wind
{
public double speed { get; set; }
public double deg { get; set; }
}
public class Clouds
{
public int all { get; set; }
}
public class Sys
{
public int type { get; set; }
public int id { get; set; }
public double message { get; set; }
public string country { get; set; }
public int sunrise { get; set; }
public int sunset { get; set; }
}
public class RootObject
{
public Coord coord { get; set; }
public List<Weather> weather { get; set; }
public string @base { get; set; }
public Main main { get; set; }
public int visibility { get; set; }
public Wind wind { get; set; }
public Clouds clouds { get; set; }
public int dt { get; set; }
public Sys sys { get; set; }
public int id { get; set; }
public string name { get; set; }
public int cod { get; set; }
}
}
我需要从以下方法启动 "Weather.Droid" 的 MainActivity:
public async Task FetchAsync(string url)
之前returns:
jsonString
我该怎么做?
看来你追求的是依赖注入。在可移植项目中声明一个接口,然后在Droid/iOS/???您支持的项目。
我在 XLabs 社区项目中创建了 IOC 的抽象。 Matt Whetton 写了一些关于如何使用它的非常好的说明:http://www.codenutz.com/getting-started-xamarin-forms-labs-xaml-mvvm-ioc/
以下方法并不理想,但有点不清楚为什么您需要调用 activity 开始至少这会给您一些想法。
便携端:
public class Class1
{
public static async Task<string> Fetch(string url, Action onComplete = null)
{
await Task.Delay(10);
onComplete?.Invoke();
return url;
}
}
在 Android 方面(如果您打算在主屏幕出现之前执行此提取,这将是您的初始屏幕或应用程序):
[Activity(Label = "App5", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
// Set our view from the "main" layout resource
SetContentView (Resource.Layout.Main);
Class1.Fetch("test", () =>
{
var intent = new Intent(this, typeof(OtherActivity));
this.RunOnUiThread(() => StartActivity(intent));
}).ContinueWith(t =>
{
if (t.IsCompleted) Log.Debug("Fetch", t.Result);
});
}
}
I need to start MainActivity of "Weather.Droid" from method:
public async Task FetchAsync(string url)
您不能直接从 Droid 项目启动 MainActivity。但正如@SKall 所说,您可以在 FetchAsync
方法中使用 Action<Intent>
:
//add Action<Intent> as and Intent as parameters
public async Task<string> FetchAsync(string url,Action<Intent> navigationFunc,Intent intent)
{
string jsonString;
...
navigationFunc(intent);//Invoke the action
return jsonString;
}
然后在您的 Droid 项目中使用它:
ParsingClass parsing = new ParsingClass();
Intent intent = new Intent(this, typeof(MainActivity));
await parsing.FetchAsync("url", StartActivity, intent);