将自定义对象传递给Xamarin Android中的下一个活动

Tom*_*pee 9 c# android android-activity xamarin

我有一些自定义对象,如RootObjectForm我要传递到下一个活动.

这是一个例子RootObject:

public class RootObject
{
    public Form Form { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但是我如何通过a传递RootObject到下一个活动并在下一个中Intent获取它Activity?在Form这里也有拥有多个物业Lists及的东西,我需要访问一些属性在我的下一个Activity.我的意图是这样的:

saveButton.Click += delegate {
    if(ValidateScreen()){
        SaveData();
        Intent intent = new Intent(this, typeof(MainActivity));
        Bundle b = new Bundle();
        b.PutSerializable("RootObject", RootObject);
        StartActivity(intent);
    }
};
Run Code Online (Sandbox Code Playgroud)

Nut*_*ker 27

我知道这是一个老问题,但我认为我的回答可能对某人有所帮助.我做的是我使用了可以使用Nuget Manager安装的JSON.Net软件包.通过使用JSON,您可以在第一个活动中序列化对象,然后在第二个活动中反序列化.我就这样做了:

活动1

using Newtonsoft.Json;
...
void mBtnSignIn_Click(object sender,EventArgs e)
{
      User user = new User();
      user.Name = "John";
      user.Password = "password";

      Intent intent = new Intent(this,typeof(Activity2));
      intent.PutExtra("User",JsonConvert.SerializeObject(user));
      this.StartActivity(intent);
      this.Finish();

}
Run Code Online (Sandbox Code Playgroud)

活动2

using Newtonsoft.Json;
...
private User user;
protected override void OnCreate(Bundle savedInstanceState)
{
      base.OnCreate(savedInstanceState);

      SetContentView(Resource.Layout.Activity2);
      user = JsonConvert.DeserializeObject<User>(Intent.GetStringExtra("User"));
}
Run Code Online (Sandbox Code Playgroud)

希望这会对某人有所帮助.


har*_*ash 10

这就是你如何去做.您的类需要实现Serializable或Parcelable.在第一个活动中(您要从中发送):

final Intent intent = new Intent(this, SecondActivity.class);
intent.putExtra("my_class", your_object);
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)

然后在你的第二个Activity中你会做:

final Intent passedIntent = getIntent();
final YourClass my_class = (YourClass) passedIntent.getSerializableExtra("my_class");
Run Code Online (Sandbox Code Playgroud)

还有另一种方法,使用Bundles ::

从您的类创建一个Bundle,如:

public Bundle toBundle() {
    Bundle b = new Bundle();
    b.putString("SomeKey", "SomeValue");

    return b;
}
Run Code Online (Sandbox Code Playgroud)

然后使用INTENT传递此包.现在,您可以通过传递bundle来重新创建类对象

public CustomClass(Context _context, Bundle b) {
    context = _context;
    classMember = b.getString("SomeKey");
}
Run Code Online (Sandbox Code Playgroud)


Joe*_*oel 5

好吧,就我而言,我想传递的对象不了解 Android 或 IOS,没有类似的东西。所以实现(Java 版本)ISerializableorIParcelable不是一个选项。

所以,我所做的是采用 JSON(使用Newtonsoft.JsonNuGet 包)方法并使用扩展方法。

public static class IntentExtension
{
    public static Intent PutExtra<TExtra>(this Intent intent, string name, TExtra extra)
    { 
        var json = JsonConvert.SerializeObject(extra);
        intent.PutExtra(name, json);
        return intent;
    }

    public static TExtra GetExtra<TExtra>(this Intent intent, string name)
    {
        var json = intent.GetStringExtra(name);
        if (string.IsNullOrWhiteSpace(json))
        {
            return default(TExtra);
        }

        return JsonConvert.DeserializeObject<TExtra>(json);
    }
}
Run Code Online (Sandbox Code Playgroud)

并称之为:

// Put extra
MyDto dto = ...; // Get from server or something
StartActivity(new Intent(this, typeof(MyActivity)).PutExtra("MY_EXTRA", dto))

// Get the extra back
var myDto = Intent.GetExtra<MyDto>("MY_EXTRA");
Run Code Online (Sandbox Code Playgroud)