2014-02-19 6 views
0

У меня есть custom view, который я сделал, чтобы захватить подпись пользователя на Android. view работает отлично, и я получаю результаты, которые я хочу. Теперь мне нужно добавить водяные знаки (маленькие тексты на четырех углах фона подписи). Я делаю это на Android и iOS, так что я сделал на iOS, чтобы создать label s, и используя некоторые конфиги, я вычисляю frame (x,y,width,heigh) во время выполнения и добавляю их в пользовательский вид. Это отлично работает на iOS (MonoTouch). Теперь мне нужно сделать то же самое на MonoForAndroid.Добавление ярлыков и изображений динамически к пользовательскому представлению в Android

До сих пор я получил это:

 
// 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 и настройка размеров и способ, которым я это выполняю, но не могу решить, где проблема.

Любая помощь была бы принята с благодарностью.

ответ

0

Я решил это, передав ссылку моего RelativeLayout, которая содержит SignatureView и использует это, чтобы удерживать новые (динамически) созданные метки (TextView) и водяные знаки. Это отлично поработало. Перед каждым relativeLayout.Add(view), я делаю relativeLayout.Remove(view), чтобы я не add тот же view дважды к макету (который мог бы выбросить exception). Я напишу сообщение в блоге об этом в ближайшее время и обновлю свой ответ здесь, чтобы включить его в список

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

Мне нужно добавить его еще раз? Я думал, что мне нужно добавить его один раз .. Я дам это попробовать –

+0

Ur измененный относительный макет не отражен bcoz, ваш rootview не знает его изменения. – Priya

+0

var viewGroup = (ViewGroup) this.RootView; Не могли бы вы объяснить, почему вы используете эту строку? – Priya

Смежные вопросы