从库中选择图像后未调用OnActivityResult

时间:2018-01-22 08:10:15

标签: c# xamarin.android

我试图允许我的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永远不会在活动或片段中被调用。我做错了什么?

额外信息 - 到目前为止我尝试过的(没有效果):

  • 将请求代码(StartActivityForResult的第二个参数)更改为不同的东西 - 我尝试了1,-1和一些随机的4位数字
  • 将调用移动到类MainActivity
  • 中的方法内的StartActivityForResult
  • 将事件处理程序lambda更改为实际方法

最后,我想强调的是,图像采集阶段就像一个魅力;我可以看到画廊并选择一张图片。问题是之后没有任何事情发生: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。我可以以某种方式为我的设备解决这个问题,以防其他人使用此设置运行应用程序吗?

1 个答案:

答案 0 :(得分:1)

1)从Fragment开始,在Activity中接收结果:使用Activity.StartActivityForResult()

2)从片段开始,在片段中接收结果:使用StartActivityForResult(),并在活动的OnActivityResult()电话base.OnActivityResult(requestCode, resultCode, data);

根据您提供的代码,看起来您想要使用2),在Fragment中接收结果,因此,请在您的片段中添加OnActivityResult()