android - 使用 Visual Studio 从 Xamarin 中的 Activity 获取对象结果

标签 android visual-studio android-activity xamarin onactivityresult

我想使用 Visual Studio 2015 从 Xamarin 中的子 Activity 接收对象:

[Serializable]
class MyObj
{
    public string value { get; }

    public MyObj(string v)
    {
        value = v;
    }
} 

child Activity

Intent myIntent = new Intent (this, typeof(FirstActivity));
MyObj obj = new MyObj("message");
myIntent.PutExtra ("obj", obj);                                        // cannot convert "obj" to Bundle
SetResult (Result.Ok, myIntent);
Finish();

FirstActivity

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    if (requestCode == 0)
        if (resultCode == Result.Ok) {
            var helloLabel = FindViewById<TextView> (Resource.Id.helloLabel);
            MyObj obj = data.GetSerializableExtra("obj") as MyObj;
            helloLabel.Text = obj.Text.ToString();
        }
    }
}

此代码导致错误 cannot convert obj to Bundle。我也尝试过实现 Java.IO.ISerializable is MyObj 但我无法获得正确的实现。它总是抛出 System.NotSupportedException: Unable to activate instance of type MyApp.MyObj from native handle 0x10001d (key_handle 0x1a027cb)

class Object1 : Java.Lang.Object, Java.IO.ISerializable
{
    public string value { get; }
    public Object1(string v)
    {
        value = v;
    }
}

我想得到一些建议。我是 Xamarin 的新手,我正在使用 Visual Studio 2015

最佳答案

我总是选择 Parcelable。速度非常快! (快 10 倍)http://www.developerphil.com/parcelable-vs-serializable/

这是在 Xamarin 中实现它的方法:

public class MyObj : Java.Lang.Object, IParcelable
{
    public string Value { get; set; }

    public MyObj()
    {
    }

    private MyObj(Parcel parcel)
    {
        // read your values in order
        Value = parcel.ReadString();
    }

    public void WriteToParcel(Parcel dest, ParcelableWriteFlags flags)
    {
        // read your values in order
        dest.WriteString(Value);
    }

    // -- stuff below here is needed from the parcel interfaces/mechanism --

    [ExportField("CREATOR")]
    public static MyObjCreator InitializeCreator()
    {
        return new MyObjCreator();
    }

    public class MyObjCreator : Java.Lang.Object, IParcelableCreator
    {
        public Java.Lang.Object CreateFromParcel(Parcel source)
        {
            return new MyObj(source);
        }

        public Java.Lang.Object[] NewArray(int size)
        {
            return new MyObj[size];
        }
    }

    public int DescribeContents()
    {
        return 0;
    }
}

设置结果

Intent myIntent = new Intent(this, typeof(FirstActivity));
MyObj obj = new MyObj {Value = "Hello"};
myIntent.PutExtra("obj", obj);
SetResult(Result.Ok, myIntent);
Finish();

OnActivityResult

var x = (MyObj)data.GetParcelableExtra("obj");

关于android - 使用 Visual Studio 从 Xamarin 中的 Activity 获取对象结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36455142/

相关文章:

android - 寻找以单一 Activity 应用程序方法在 Android 中实现 SearchView 的想法

android - Windows 上的 Calabash-Android

c# - 我需要哪些 SOAP/WS-Security/WS-Addressing/etc 来发送这条消息

windows - 使用CMake在Visual Studio中构建ARM64 ASM

java - Android Activity 和 Service 之间的通信

android - 当 Activity 完全布局并准备好进行用户交互时,会调用哪个方法?

java - 如何在 Android 中更新来自 Firebase 的电子邮件?

android - 设置输出文件名/Gradle 时不支持绝对路径

android - 如何在android上构建hidd?

visual-studio - 将LLVM Clang 4.x.x/5.x.x/6.x.x集成到Visual Studio 2017中