View zu custom layout hinzufügen.

  • Antworten:1
Barbaric Chicken
  • Forum-Beiträge: 66

20.11.2013, 09:18:45 via Website

Hallo,

ich stehe mal wieder auf dem Schlauch vielleicht kann diesesmal jemand helfen.

Ich möchte einen Rahmen mit Überschrift zeichnen. In diesen Rahmen sollen dann Childviews eingefügt werden können die innerhalb dieses Rahmens zu sehen sind.
Hierfür habe ich eine eigene Klasse von LinearLayout abgeleitet und die onDraw Methode überschrieben. Der Rahmen + Überschrift wird wunderbar dargestellt.
Doch es lassen sich einfach keine Views in das Layout adden. Die große Frage ist, warum? Was habe ich übersehen oder was blockiert die Sicht auf die Views? Hier mal die Custom Klasse:

1public class CustomCell extends LinearLayout
2{
3 private Paint painter;
4 private Rect rect;
5 private Context context;
6 private String title;
7 private int textSize;
8 private float px;
9
10 public CustomCell(Context context,String title)
11 {
12 super(context);
13 this.context = context;
14 this.title = title;
15
16 painter = new Paint();
17 painter.setColor(Color.BLACK);
18 painter.setStyle(Style.STROKE);
19 painter.setStrokeWidth(2);
20
21 px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, context.getResources().getDisplayMetrics());
22 textSize = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, context.getResources().getDisplayMetrics());
23
24 this.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT));
25 this.setWillNotDraw(false);
26
27 rect = new Rect(0,0,getWidth(),getHeight());
28
29 setOrientation(LinearLayout.VERTICAL);
30
31
32 Button b = new Button(context);
33 b.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
34 b.setText("Hallo ich bin ein Button");
35 addView(b);
36
37 }
38
39
40
41
42
43 @Override
44 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
45 {
46 float fivePx = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 5, context.getResources().getDisplayMetrics());
47 final int width = context.getResources().getDisplayMetrics().widthPixels - (int)fivePx;
48 final int height = (int)(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, context.getResources().getDisplayMetrics()));
49
50 int w = widthMeasureSpec;
51 int h = heightMeasureSpec;
52
53 if(getLayoutParams().width == ViewGroup.LayoutParams.WRAP_CONTENT)
54 {
55 w = width;
56 }
57
58 if(getLayoutParams().height == ViewGroup.LayoutParams.WRAP_CONTENT)
59 {
60 h = height;
61 }
62
63 setMeasuredDimension(w, h);
64
65 }
66
67
68 @Override
69 protected void onDraw(Canvas canvas)
70 {
71 // TODO Auto-generated method stub
72 super.onDraw(canvas);
73 rect.set(0, 0, getWidth(), getHeight());
74 canvas.drawRect(rect, painter);
75
76 rect.set(1,1,(int)(getWidth()*0.7),(int)(getHeight()*0.2));
77 canvas.drawRect(rect, painter);
78 painter.setColor(Color.rgb(51, 204, 204));
79 painter.setStyle(Style.FILL);
80
81 canvas.drawRect(rect, painter);
82
83 painter.setColor(Color.WHITE);
84 painter.setTextSize((int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,20, context.getResources().getDisplayMetrics()));
85 painter.setAntiAlias(true);
86 canvas.drawText(title, px, px+textSize, painter);
87
88 }
89
90
91}

Ich habe gelesen, dass man die Methode addView überschreiben soll, verstehe jedoch nicht ganz, wie ich dann über diese Funktion view adden kann.

Vielen Dank.

Mit freundlichen Grüßen

Antworten
Barbaric Chicken
  • Forum-Beiträge: 66

21.11.2013, 09:43:15 via Website

Also ich habe mittlerweile heraus gefunden, dass ich wohl die onLayou Methode überschreiben muss und dort für jedes Child Element die layout Methode aufrufen muss. In dieser muss dann größe und Position des Childs angegeben werden.


Mein Problem ist jetzt, der Button hat an der Stelle noch keine Größe. Woher weiß ich also wie groß ich den machen soll?
Klar kann ich den so breit und hoch setzen wie ich möchte, aber wenn ich den auf WRAP_CONTENT haben will, woher soll ich wissen wie groß er dann sein muss?

MfG

Antworten