我试图允许我的Xamarin.Android应用程序的用户从他们的图库中选择一个图像并将其上传到服务器。一旦选中,图像应首先显示在上载表单中,然后转换为base64并发送到远程Web应用程序。
我的应用只使用一个包含FrameLayout的活动,该活动会被Fragments填充。应该处理模块的片段(它是动态的并且依赖于它从服务器接收的模式)正在实例化选择控件,如下所示:
private View BuildImageUploader()
{
LinearLayout lay = new LinearLayout(Context);
lay.Orientation = Orientation.Horizontal;
lay.LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent);
(lay.LayoutParameters as LinearLayout.LayoutParams).SetMargins(0, 30, 0, 0);
ImageView img = new ImageView(Context);
var par = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent, 0.8f);
par.Gravity = GravityFlags.Center;
par.TopMargin = 5;
img.LayoutParameters = par;
Button btn = new Button(Context);
btn.LayoutParameters = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MatchParent, ViewGroup.LayoutParams.WrapContent, 0.2f);
btn.Text = "Scegli";
btn.Click += (s, e) =>
{
Intent intent = new Intent();
intent.SetType("image/*");
intent.SetAction(Intent.ActionGetContent);
StartActivityForResult(Intent.CreateChooser(intent, "Scegli un'immagine"), 0);
};
lay.AddView(img);
lay.AddView(btn);
return lay;
}
我在我的片段和MainActivity中添加了OnActivityCreated
的相同覆盖:
protected override void OnActivityResult(int requestCode, [GeneratedEnum] Result resultCode, Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
}
是的,它绝对没有任何内容,目前无法恢复图像,但我打算用事件处理。覆盖仍然是空的,因为我通过在其中放置断点来测试它们,以检查哪一个被调用。你猜怎么着?没有。 OnActivityResult
永远不会在活动或片段中被调用。我做错了什么?
额外信息 - 到目前为止我尝试过的(没有效果):
最后,我想强调的是,图像采集阶段就像一个魅力;我可以看到画廊并选择一张图片。问题是之后没有任何事情发生:OnActivityResult没有被调用,我用断点验证了这一点。感谢任何愿意提供帮助的人,我需要这个工作,现在我非常绝望,所以我想任何解决方案都可以。
编辑:我被要求包含处理控件图的代码。我无法全部包含它(它超过1000行,所有其他控件仍在工作),因此我将展示有关此特定控件的部分:
private void ShowItem(LinearLayout container, DynamicFieldSchemaItem item)
{
GuiControlType type = GuiControlType.GetGuiControlTypeById(item.SystemGuiControlId);
List<View> toAdd = new List<View>();
switch(type.Enum)
{
// Various cases for other controls...
case GuiControlTypeEnum.UploadImage:
toAdd.Add(BuildImageUploader());
break;
}
foreach (View view in toAdd)
container.AddView(view);
}
此处使用了container
,因为控件在选项卡中分开,因此应用程序为每个选项卡创建单独的LinearLayout,然后通过ShowItem
向其添加控件,在每个收到的项目上调用来自服务器。
更新:当我在其他设备上测试不相关的功能时,我不小心点击了上传器按钮,关闭了它,并且切换了Activity的OnActivityResult断点。这意味着问题是 with my device 。我有一个带有LineageOS文件浏览器和图库的OnePlus One。我可以以某种方式为我的设备解决这个问题,以防其他人使用此设置运行应用程序吗?
答案 0 :(得分:1)
1)从Fragment开始,在Activity中接收结果:使用Activity.StartActivityForResult()
2)从片段开始,在片段中接收结果:使用StartActivityForResult()
,并在活动的OnActivityResult()
电话base.OnActivityResult(requestCode, resultCode, data);
根据您提供的代码,看起来您想要使用2),在Fragment中接收结果,因此,请在您的片段中添加OnActivityResult()
。