C# 在C中的Android活动之间传递自定义对象#
我正在VS2012中使用Xamarin.android创建一个android应用程序。我正在主屏幕中显示自定义列表。当用户单击列表项时,我需要将一个自定义对象(具有ID、String、String、String属性)从这个主活动传递给另一个主活动 谁能帮我举个例子吗 编辑: 我已经试过了 但问题是我得到了以下例外: 这就是我在第二个活动中提取的方式C# 在C中的Android活动之间传递自定义对象#,c#,android,xamarin.android,xamarin,C#,Android,Xamarin.android,Xamarin,我正在VS2012中使用Xamarin.android创建一个android应用程序。我正在主屏幕中显示自定义列表。当用户单击列表项时,我需要将一个自定义对象(具有ID、String、String、String属性)从这个主活动传递给另一个主活动 谁能帮我举个例子吗 编辑: 我已经试过了 但问题是我得到了以下例外: 这就是我在第二个活动中提取的方式 InsuranceReminderBO i = (InsuranceReminderBO)Intent.GetSerializableExtra("
InsuranceReminderBO i = (InsuranceReminderBO)Intent.GetSerializableExtra("SelectedItemID");
i为空
在第一个活动设置中,如下所示:
Intent intent = new Intent(this, typeof(ReminderDetails));
intent.PutExtra("SelectedItemID", selectedInsurance);
StartActivity(typeof(ReminderDetails));
intent.PutExtra("SelectedItemId", JsonSerializer.SerializeToString(selectedInsurance));
其中类别保险提醒BO
定义为
public class InsuranceReminderBO : Java.Lang.Object, Java.IO.ISerializable
我也尝试过使用IParcelable
,但我得到了错误创建者未定义
在ICreator或Creator中
在CustomObject上实现iParceable之后
'public class InsuranceReminderBO : Java.Lang.Object, IParcelable
{
public InsuranceReminderBO()
{
}
#region Objects and Properties
private int id;
private String strCompanyName;
private String strPremiumAmount;
private String stDueDate;
public int ID
{
get { return this.id; }
set { this.id = value; }
}
public String Company_Name
{
get { return this.strCompanyName; }
set { this.strCompanyName = value; }
}
public String Premium_Amount
{
get { return this.strPremiumAmount; }
set { this.strPremiumAmount = value; }
}
public String Due_Date
{
get { return this.stDueDate; }
set { this.stDueDate = value; }
}
#endregion
#region IParcelable implementation
// The creator creates an instance of the specified object
private static readonly GenericParcelableCreator<InsuranceReminderBO> _creator
= new GenericParcelableCreator<InsuranceReminderBO>((parcel) => new InsuranceReminderBO(parcel));
[ExportField("CREATOR")]
public static GenericParcelableCreator<InsuranceReminderBO> GetCreator()
{
return _creator;
}
// Create a new SelectListItem populated with the values in parcel
private InsuranceReminderBO(Parcel parcel)
{
ID = parcel.ReadInt();
Company_Name = parcel.ReadString();
Premium_Amount = parcel.ReadString();
Due_Date = parcel.ReadString();
}
public int DescribeContents()
{
return 0;
}
// Save this instance's values to the parcel
public void WriteToParcel(Parcel dest, ParcelableWriteFlags flags)
{
dest.WriteInt(ID);
dest.WriteString(Company_Name);
dest.WriteString(Premium_Amount);
dest.WriteString(Due_Date);
}
// Closest to the 'Java' way of implementing the creator
/*public sealed class SelectListItemCreator : Java.Lang.Object, IParcelableCreator
{
public Java.Lang.Object CreateFromParcel(Parcel source)
{
return new SelectListItem(source);
}
public Java.Lang.Object[] NewArray(int size)
{
return new SelectListItem[size];
}
}*/
#endregion
}
#region GenericParcelableCreator
/// <summary>
/// Generic Parcelable creator that can be used to create objects from parcels
/// </summary>
public sealed class GenericParcelableCreator<T> : Java.Lang.Object, IParcelableCreator
where T : Java.Lang.Object, new()
{
private readonly Func<Parcel, T> _createFunc;
/// <summary>
/// Initializes a new instance of the <see cref="ParcelableDemo.GenericParcelableCreator`1"/> class.
/// </summary>
/// <param name='createFromParcelFunc'>
/// Func that creates an instance of T, populated with the values from the parcel parameter
/// </param>
public GenericParcelableCreator(Func<Parcel, T> createFromParcelFunc)
{
_createFunc = createFromParcelFunc;
}
#region IParcelableCreator Implementation
public Java.Lang.Object CreateFromParcel(Parcel source)
{
return _createFunc(source);
}
public Java.Lang.Object[] NewArray(int size)
{
return new T[size];
}
#endregion
}
#endregion'
第二个活动中的阅读
InsuranceReminderBO i = (InsuranceReminderBO)Intent.GetParcelableExtra("SelectedItem");
但是将i设置为null。有一篇文章介绍了在Xamarin中使用IParcelable 就我个人而言,我一直只是序列化为JSON,额外传递一个字符串,然后在另一端反序列化它 如果您正在使用,我喜欢,您可以这样做:
Intent intent = new Intent(this, typeof(ReminderDetails));
intent.PutExtra("SelectedItemID", selectedInsurance);
StartActivity(typeof(ReminderDetails));
intent.PutExtra("SelectedItemId", JsonSerializer.SerializeToString(selectedInsurance));
另一方面:
var insurance = JsonSerializer.DeserializeFromString<InsuranceReminderBO>(Intent.GetStringExtra("SelectedItemId"))
var insurance=JsonSerializer.DeserializeFromString(Intent.GetStringExtra(“SelectedItemId”))
无需实现
Java.Lang.Object、Java.IO.ISerializable
在Google上进行了大量搜索之后,我终于找到了解决方案
基本上我使用了
StartActivity(intent)代码>要在servicestack.text解决方案上添加tail,您只需下载android DLL并将其引用到您的解决方案中即可。您可以使用它并将其添加到您的解决方案中,作为备选方案单独构建它
此外,我还使用了一些方法来来回转换项目,这可能会有所帮助,请尝试
static public string ToJSON(this object item)
{
var myval = JsonSerializer.SerializeToString(item);
return myval;
}
static public T FromJSON<T>(string code)
{
var item = JsonSerializer.DeserializeFromString<T>(code);
return item;
}
静态公共字符串ToJSON(此对象项)
{
var myval=JsonSerializer.SerializeToString(项);
返回myval;
}
静态公共T FromJSON(字符串代码)
{
var item=JsonSerializer.DeserializeFromString(代码);
退货项目;
}
我尝试了丹·克拉克的解决方案。但在反序列化时,我得到了空引用错误。我必须为[JsonSerializer]添加什么名称空间或引用?它在ServiceStack.Text中。您也可以使用JSON.NET-语法略有不同,但大致相同。我尝试下载ServiceStack.Text,但在安装包时遇到以下错误:无法安装包“ServiceStack.Text 3.9.63”。您正试图将此软件包安装到目标为“MonoAndroid,Version=v2.2”的项目中,但该软件包不包含任何与该框架兼容的程序集引用。有关详细信息,请与软件包作者联系。发现软件包安装错误…如果您发布了可插入的代码,我们也可以看到问题所在。@SpiritMachine请参阅我上面的编辑。那么您是否有JSON序列化的工作解决方案?如果没有,你能发布你用IParcelable得到的空引用的堆栈跟踪吗?@SpiritMachine no JSON序列化对我来说不起作用,但我在谷歌搜索了很多次后找到了我自己问题的答案。谢谢。一段时间后,我突然想到了这一点,但我已经用StartActivity(intent)实现了iParceable,而且它正在工作。。。。可能在我的下一个阶段或项目中,我将使用jsonserializer。。。谢谢你的帮助。。。