簡體   English   中英

如何從另一個項目啟動 Activity

[英]How to start Activity from another project

我正在為 android 和 windows-phone 開發天氣應用程序。 所以我在“解析類”中的“Weather.Api(Portable)”中的另一個項目中編寫了通用代碼。 “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:

公共異步任務 FetchAsync(string url)

在它返回之前:

json字符串

我怎樣才能做到這一點?

看起來你所追求的是依賴注入。 在可移植項目中聲明一個接口,然后在Droid/iOS/???中實現它你支持的項目。

我在 XLabs 社區項目中創建了 IOC 的抽象。 Matt Whetton 寫了一些關於如何使用它的非常好的說明: http : //www.codenutz.com/getting-started-xamarin-forms-labs-xaml-mvvm-ioc/

以下方法並不理想,但有點不清楚為什么您需要調用活動開始至少這會給您一些想法。

在便攜方面:

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);
        });
    }
}

我需要從方法啟動“Weather.Droid”的 MainActivity:

公共異步任務 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM