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
相关产品推荐
相关产品推荐

