You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Android中跨Activity传递Intent及数据获取问题

在Xamarin.Android中传递Intent的Data和ClipData到另一个Activity

看你现在的代码,问题出在传递方式上——你用intent.PutExtras(intent)是把当前MainActivity的Intent的额外数据复制到新Intent里,但Data和ClipData是Intent的直接属性,不属于Extras范畴,所以这么做根本传不过去你想要的内容。下面给你正确的传递和获取方式:

一、MainActivity中正确传递Data和ClipData

假设你已经有了要传递的Uri(即Intent.Data)和ClipData,或者是从文件选择等场景拿到的结果Intent,代码可以这么写:

场景1:直接传递自定义的Data和ClipData

// 先准备好要传递的Data Uri和ClipData(根据你的实际场景获取)
Uri targetDataUri = ...; // 比如从文件路径生成的Uri
ClipData targetClipData = ...; // 比如包含多个文件Uri的ClipData

Intent intent = new Intent(this, typeof(SecondActivity));
// 直接设置Intent的Data属性
intent.SetData(targetDataUri);
// 设置ClipData属性
intent.ClipData = targetClipData;
// 可选:加个标记Extra,用来判断是否有我们需要的内容
intent.PutExtra("FilesURI", true);
StartActivity(intent);

场景2:传递从文件选择等场景拿到的结果Intent的Data和ClipData

如果你的MainActivity是接收文件选择的返回结果,直接把结果里的Data和ClipData转递给SecondActivity即可:

// 旧版OnActivityResult方式(适用于Xamarin.Android旧版本)
protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
    base.OnActivityResult(requestCode, resultCode, data);
    if (resultCode == Result.Ok && requestCode == 1001) // 1001是你的请求码
    {
        Intent intent = new Intent(this, typeof(SecondActivity));
        intent.SetData(data.Data);
        intent.ClipData = data.ClipData;
        intent.PutExtra("FilesURI", true);
        StartActivity(intent);
    }
}

// 新版ActivityResultContracts方式(推荐)
private readonly ActivityResultLauncher<Intent> _filePickerLauncher = RegisterForActivityResult(
    new ActivityResultContracts.StartActivityForResult(),
    result =>
    {
        if (result.ResultCode == (int)Result.Ok && result.Data != null)
        {
            Intent intent = new Intent(this, typeof(SecondActivity));
            intent.SetData(result.Data.Data);
            intent.ClipData = result.Data.ClipData;
            intent.PutExtra("FilesURI", true);
            StartActivity(intent);
        }
    });

二、SecondActivity中正确获取Data和ClipData

在SecondActivity的OnCreate方法里,直接从当前的Intent对象获取即可:

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    SetContentView(Resource.Layout.activity_second);

    Intent incomingIntent = Intent;
    // 先判断我们加的标记(可选,根据你的需求)
    if (incomingIntent.HasExtra("FilesURI"))
    {
        // 获取传递过来的Data
        Uri receivedData = incomingIntent.Data;
        if (receivedData != null)
        {
            // 这里处理你的Data Uri,比如获取文件路径、读取文件内容等
            // 示例:string filePath = receivedData.Path;
        }

        // 获取传递过来的ClipData
        ClipData receivedClipData = incomingIntent.ClipData;
        if (receivedClipData != null)
        {
            // 遍历ClipData里的所有Item(比如多选的文件)
            for (int i = 0; i < receivedClipData.ItemCount; i++)
            {
                ClipData.Item item = receivedClipData.GetItemAt(i);
                Uri itemUri = item.Uri;
                // 处理每个Item的Uri
            }
        }
    }
}

总结一下:不要用PutExtras来传递Data和ClipData,它们是Intent的顶层属性,直接设置和读取就好啦。

内容的提问来源于stack exchange,提问作者Amit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:43:06