# canvas in view anzeigen



## Gast2 (28. Sep 2012)

Hi, 

ich habe eine *canvas *erstellt und möchte diese nun *auf meinem view anzeigen lassen*.
Leider bekomme ich das nicht hin,
meine canvas wird nicht angezeigt.
Hier meine Quellen...
*vielleicht kann mir jemand sagen (schreiben) was fehlt?!*

activity_main.xml
[XML]<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/relativ_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/txv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="18dp"
        android:layout_marginTop="26dp"
        android:text="@string/hello_world"
        android:textSize="30dp"
        tools:context=".MainActivity" />

    <ivi.uebungondraw2.DrawView
        android:layout_below="@+id/txv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" />

</RelativeLayout>[/XML]

MainActivity.java

```
package ivi.uebungondraw2;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

	DrawView drawView;
	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		drawView = new DrawView(this);
	}
}
```

DrawView.java

```
package ivi.uebungondraw2;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.view.View;

public class DrawView extends View {
	Bitmap bitmap;
	Canvas bitmapCanvas;

	boolean isInitialized;
	Paint paint = new Paint();

	public DrawView(Context context) {
		super(context);

		paint.setColor(Color.BLACK);
		paint.setStyle(Style.FILL_AND_STROKE);

		isInitialized = false;
	}

	private void init() {
		bitmap = Bitmap.createBitmap(470, 320, Bitmap.Config.RGB_565);

		bitmapCanvas = new Canvas();
		bitmapCanvas.setBitmap(bitmap);
		bitmapCanvas.drawColor(Color.rgb(250, 250, 250));

		isInitialized = true;

		bitmapCanvas.drawLine(10, 10, 10, 300, paint);
		bitmapCanvas.drawLine(10, 160, 310, 160, paint);
		invalidate();
	}

	@Override
	public void onDraw(Canvas canvas) {
		if (!isInitialized)
			init();
		canvas.drawBitmap(bitmap, 0, 0, paint);
	}
}
```

*? ? ?*


----------



## Tomate_Salat (28. Sep 2012)

Was soll den passieren? Du definierst einmal deinen View im XML und einmal erstellt du diesen View im Source, weist ihn aber nirgends zu. 

Ich bin mir nicht sicher, aber ich glaube: Eigene Views fürs XML müssen den View-Konstruktor mit 2 Parametern bereitstellen [wobei ich generell immer alle 3 Konstruktoren vom View implementiere). 
Zudem: wenn du mit dem View arbeiten willst, würde ich mit IDs arbeiten.


----------



## Gast2 (28. Sep 2012)

Ok, ID füge ich hinzu und auch die drei Parameter.

ABER so wie der Quelltext oben zu sehen ist gibt es eine InflateException in der xml, Zeile 19
[XML] <ivi.uebungondraw2.DrawView[/XML]

dabei habe ich den namespace mit copy + paste übernommen, Fehler in der Schreibung halte ich für ausgeschlossen.

*Warum kann die canvas denn nicht inflated werden?*


----------



## Tomate_Salat (28. Sep 2012)

Zeig mal bitte deinen angepassten DrawView und poste sicherheitshalber mal noch die genaue Fehlermeldung.


----------



## Gast2 (28. Sep 2012)

DrawView:

```
package ivi.uebungondraw2;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.View;

public class DrawView extends View {
	
	boolean isInitialized;
	int hoehe;
	Paint paint = new Paint();
	Bitmap bitmap;
	Canvas bitmapCanvas;

	public DrawView(Context context, AttributeSet attrs, int height) {
		super(context, attrs);
		hoehe = height;
		paint.setColor(Color.BLACK);
		paint.setStyle(Style.FILL_AND_STROKE);
		isInitialized = false;
	}

	private void init() {
		bitmap = Bitmap.createBitmap(470, hoehe, Bitmap.Config.RGB_565);
		bitmapCanvas = new Canvas();
		bitmapCanvas.setBitmap(bitmap);
		bitmapCanvas.drawColor(Color.rgb(250, 250, 250));
		isInitialized = true;
		bitmapCanvas.drawLine(10, 10, 10, 300, paint);
		bitmapCanvas.drawLine(10, 160, 310, 160, paint);
		invalidate();
	}

	@Override
	public void onDraw(Canvas canvas) {
		if (!isInitialized) init();
		canvas.drawBitmap(bitmap, 0, 0, paint);
	}
}
```

die Fehlermeldung (LogCat):


----------



## Tomate_Salat (28. Sep 2012)

View | Android Developers

Schau nochmal in die Dokumentation. Du brauchst du diesen Konstruktor:

```
public DrawView(Context c,AttributSet a) {
}
```



			
				Doku hat gesagt.:
			
		

> public View (Context context, AttributeSet attrs)
> 
> Since: API Level 1
> Constructor that is called when inflating a view from XML. This is called when a view is being constructed from an XML file, supplying attributes that were specified in the XML file. This version uses a default style of 0, so the only attribute values applied are those in the Context's Theme and the given AttributeSet.


----------



## Gast2 (28. Sep 2012)

Oh, super!
Vielen Dank!

Jetzt wird die canvas dargestellt.

Aber leider *nicht unter dem TextView*, so wie im RelativeLayout angegeben...
[XML]android:layout_below="@+id/txv"[/XML]

Es sollte unter dem Text erscheinen.
Statt dessen erscheint es als einziges und am oben auf dem  Bildschirm.


----------



## Tomate_Salat (28. Sep 2012)

Versuch es doch mal über den GUI-Editor zu positionieren. Sonst arbeite ich immer mit der XML, aber beim RelativeLayout greife ich gerne auf den GUI-Editor zurück, der ist eigentl. ziemlich gut.


----------



## Gast2 (28. Sep 2012)

Es wird im GUI-Editor richtig dargestellt,
nur leider nicht auf dem Endgerät und auch nicht auf dem virtual device, 
nicht mal das margin_top 50dp.


----------



## Gast2 (28. Sep 2012)

Im TableLayout oder LinearLayout sieht es genauso aus.


----------



## Gast2 (28. Sep 2012)

*Jetzt hab ich's!!!*

Aus der MainActivity.java
musste ich
	
	
	
	





```
setContentView(drawView);
```
löschen. 

Auf ins Wochenende!


----------

