将标签和图像动态添加到 Android 中的自定义视图

Posted

技术标签:

【中文标题】将标签和图像动态添加到 Android 中的自定义视图【英文标题】:Adding Labels and images dynamically to a custom view in Android 【发布时间】:2014-03-19 17:05:15 【问题描述】:

我有一个custom view,用于捕获android 上的用户签名。 view 工作正常,我得到了我想要的结果。现在我需要添加水印(签名框背景四个角上的小文字)。我在 Android 和 ios 上执行此操作,所以我在 iOS 上所做的是创建 labels,并使用一些配置在运行时计算 frame (x,y,width,heigh) 并将它们添加到自定义视图中。这在 iOS (MonoTouch) 上效果很好。现在我需要在 MonoForAndroid 上做同样的事情。

到目前为止,我得到了这个:

// 我的自定义视图 公共签名视图:视图,ISignatureView // 这里有一些不相关的代码 // 然后是 OnDraw(这是我画签名线的地方) 受保护的覆盖无效 OnDraw(画布画布) DrawWaterMarks(); 私人无效DrawWaterMarks() // 首先,我创建一个 RelativeLayout 并将其添加到我的 customView 以保存标签 _relativeLayout = new RelativeLayout(this.Context); var layoutParam = new RelativeLayout.LayoutParams(this.MeasuredWidth, this.MeasuredHeight); _relativeLayout.LayoutParameters = layoutParam; var viewGroup = (ViewGroup)this.RootView; viewGroup.AddView(_relativeLayout); // 然后我创建标签 ILabel 标签 = 新标签(上下文); label.Layout(watermark.x, watermark.y, 0,0); EnsureAddingWatermarkControl(label); 私人无效 EnsureAddingWatermarkControl(查看视图) if (_relativeLayout != null && view != null) _relativeLayout.RemoveView(view); _relativeLayout.AddView(view, view.MeasuredWidth, view.MeasuredHeight); this.Invalidate();

现在上面的代码工作正常,没有异常或错误,但我看不到我的任何标签。

我假设它是RelativeLayout 和尺寸设置以及我这样做的方式,但无法找出问题所在。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

这里的问题可能是,它显示了onDraw中已经添加的相对布局。所以在rootview这个方法之后或者里面添加你的相对布局

EnsureAddingWatermarkControl(View view)

您在代码中给出了以下注释。

// 首先,我创建一个RelativeLayout 并将其添加到我的customView 中 拿着标签

首先您应该将您的labels 添加到您的相对布局中,然后您应该将您的相对布局添加到您的customView(如您提供的代码 sn-p 中所述)

所以你的代码应该是这样的

private void DrawWaterMarks()

        ILabel label = new Label(Context);
        label.Layout(watermark.x, watermark.y, 0,0);
        EnsureAddingWatermarkControl(label);


private void EnsureAddingWatermarkControl(View view)

        if (view != null)
        
           _relativeLayout = new RelativeLayout(this.Context);
        var layoutParam = new RelativeLayout.LayoutParams(this.MeasuredWidth, this.MeasuredHeight);
        _relativeLayout.LayoutParameters = layoutParam;
                    _relativeLayout.AddView(view, view.MeasuredWidth, view.MeasuredHeight);

        var viewGroup = (ViewGroup)this.RootView;
        viewGroup.AddView(_relativeLayout);


            this.Invalidate();
                   

【讨论】:

需要重新添加吗?我想我需要添加一次。我会试试看 你改变的相对布局没有反映bcoz,你的rootview不知道它的修改。 var viewGroup = (ViewGroup)this.RootView;您能解释一下为什么要使用上述行吗? 编辑了我的答案。试一试 在您关注的链接中,他们正在使用片段。所以他们的视图可以被投射到 ViewGroup 中,因为他们要膨胀的视图将是一个布局。在这里,您正在使用视图。不是布局。【参考方案2】:

我通过传递包含SignatureViewRelativeLayout 的引用并使用它来保存新(动态)创建的标签(TextView)和水印来解决它。这很好用。在每个relativeLayout.Add(view) 之前,我都会执行relativeLayout.Remove(view) 以确保我不会将add 与相同的view 布局两次(这可能会引发exception)。我将很快写一篇关于此的博客文章,并将在此处更新我的答案以包含该内容

【讨论】:

以上是关于将标签和图像动态添加到 Android 中的自定义视图的主要内容,如果未能解决你的问题,请参考以下文章

Android:SectionIndexer 的自定义视图布局和动态禁用 SectionIndexer

如何通过android studio中的自定义插件的操作在项目中动态添加依赖项?

如何使用标签或标识符将多张图片添加到自定义 tableviewcells

Android:将数据添加到 ArrayAdapter 时可见的 ListView 图像闪烁

Android:创建自定义视图并将其动态添加到布局中

swift和xcode 6中的自定义标签栏