将标签和图像动态添加到 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 上所做的是创建 label
s,并使用一些配置在运行时计算 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 中 拿着标签
首先您应该将您的label
s 添加到您的相对布局中,然后您应该将您的相对布局添加到您的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】:我通过传递包含SignatureView
的RelativeLayout
的引用并使用它来保存新(动态)创建的标签(TextView
)和水印来解决它。这很好用。在每个relativeLayout.Add(view)
之前,我都会执行relativeLayout.Remove(view)
以确保我不会将add
与相同的view
布局两次(这可能会引发exception
)。我将很快写一篇关于此的博客文章,并将在此处更新我的答案以包含该内容
【讨论】:
以上是关于将标签和图像动态添加到 Android 中的自定义视图的主要内容,如果未能解决你的问题,请参考以下文章
Android:SectionIndexer 的自定义视图布局和动态禁用 SectionIndexer
如何通过android studio中的自定义插件的操作在项目中动态添加依赖项?
如何使用标签或标识符将多张图片添加到自定义 tableviewcells