# [Android] contentView ändern



## Maxim6394 (30. Apr 2012)

in der android activity funktioniert 
	
	
	
	





```
setContentView(new Level_01(this));
```
 beim ersten mal, aber ich muss es irgendwie ändern können. 
so hab ichs versucht:

```
public void changeLevel()
	{
		view.post(new Runnable() {

			public void run() {
				
				loop.running=false;
				context.setContentView(new Level_02(context));
			}

		});
	}
```
das level wird zwar geladen und die geladenen objekte werden im log ausgegeben, aber dann schließt sich die app einfach nur, ohne fehlermeldung.
weis jemand wie das geht?


----------



## schlingel (30. Apr 2012)

Mach es anders. Es ist immer schlecht gegen das geplante Design der Anwendung zu arbeiten. Dazu auch die Doku der Activity-Klasse:



> *An activity is a single, focused thing that the user can do*. Almost all activities interact with the user, so the Activity class takes care of creating a window for you in which you can place your UI with setContentView(View).



Starte einfach eine neue Activity wenn du ein neues Level brauchst. Du kannst ja die Content-View als Parameter in den Intent packen wenn ansonsten immer alles gleich ist. per finish kannst du dann der alten sagen sich zu schließen.


----------



## Tomate_Salat (30. Apr 2012)

Oder verwende Fragmente und wenn du schon dabei bist: achte auf Conventionen. 

Level_01 => Level01 wobei das ein denkbar schlechter Name ist. Vllt ergibt der im Kontext Sinn, aber es erinnert doch eher an: 
textfeld1
textfeld2
textfeld3
textfeld4
textfeld5
...
textlfeldn


----------



## Maxim6394 (1. Mai 2012)

ich versuche jetzt mit setcontentview(new Level02(view)) das level zu ändern, es wird geladen und die updateloop funktioniert richtig, aber der verdammter canvas ist immer null, die ganze zeit. ich hol mir den canvas ganz normal:

```
public void drawGame() {

		Canvas c = null;

		try {

			c = view.getHolder().lockCanvas();
			synchronized (view.getHolder()) {
				view.onDraw(c);
			}

		} finally {
			if (c != null) {
				view.getHolder().unlockCanvasAndPost(c);
			}
		}
	}
```

auch 
	
	
	
	





```
Log.d("canvas", String.valueOf(getHolder().lockCanvas()));
```
gibt immer nur null. wieso?

wenn ich in der activity direkt das level als contentview setze und es dann ins andere level ändere, geht es.
wenn ich nur das main menu als contentview setze und von da aus dann zum level switche, gehts nicht.
im main menu wird nur ein einziges mal der canvas aufgerufen und drauf gemalt, auf die gleiche weise wie in der loop.


```
public void surfaceCreated(SurfaceHolder holder) {

				buttons.add(new Button("new Game", m) {
					public void onTouchEvent() {
						
					
						m.context.setContentView(new Level_01(m.context));
					}
				});
				
				
				
				Canvas c = null;
				try {

					c = holder.lockCanvas();
					synchronized (holder) {
						onDraw(c);
					}

				} finally {
					if (c != null) {
						holder.unlockCanvasAndPost(c);
					}
				}

			}
```

nach mehr als ner halben stunde rumprobieren hab ich rausgefunden dass der contentview wechsel nicht geht wenn ich die buttons vor dem malen des canvas hinzufüge, absolut keine ahnung wieso. anders kann ichs wohl kaum machen, es wird nur 1 mal gemalt, wenn ich die buttons danach hinzufüge ist natürlich nichts zu sehen.

wenn ich die buttons in der draw methode erstellt funktioniert der erste contentview wechsel, beim zweiten wird dann wieder überhaupt nichts gemalt.
ich bin seit monaten an der verfluchten app dran, ich muss das irgendwie lösen.


----------

