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

时间:2014-02-19 11:35:15

标签: android xamarin.android

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

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

// my customView
public signatureView : View, ISignatureView
{
    // some irrelvant code here

    // then OnDraw (which is where I draw the signature line)   
    protected override void OnDraw(Canvas canvas)
    {
        DrawWaterMarks();
    }   

    private void DrawWaterMarks()
    {
        // First, I create a RelativeLayout and add it to my customView to hold the labels
        _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);

        // I then create the labels
        ILabel label = new Label(Context);
        label.Layout(watermark.x, watermark.y, 0,0);
        EnsureAddingWatermarkControl(label);

    }

    private void EnsureAddingWatermarkControl(View view)
    {
        if (_relativeLayout != null && view != null)
        {
            _relativeLayout.RemoveView(view);
            _relativeLayout.AddView(view, view.MeasuredWidth, view.MeasuredHeight);
            this.Invalidate();
        }           
    }

}

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

我假设它是RelativeLayout以及尺寸的设置和我正在做的方式,但无法解决问题所在。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

这里的问题可能是,它显示了onDraw中已添加的相对布局。因此,在此方法之后或之内,在rootview中添加相对布局

EnsureAddingWatermarkControl(View view)

您在代码中提供了以下评论。

  

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

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

所以你的代码应该像

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();
        }           
}

答案 1 :(得分:0)

我通过传递包含RelativeLayout的{​​{1}}的引用并使用它来保存新(动态)创建的标签(SignatureView)和水印来解决它。这很有效。在每TextView之前,我会relativeLayout.Add(view)确保我没有relativeLayout.Remove(view)两次add布局(可能会抛出view)。我将很快写一篇关于此的博客文章,并在此更新我的答案,以包括