# Verständisfrage bzgl. Buttons und ihnen eine Funktion geben.



## Khaleed (3. Dez 2013)

Moin!

Ich bin ein Neueinsteiger in der Welt des Programmierens. Ich habe begonnen mit dem Buch "Android Apps entwickeln" das Programmieren von Apps zu erlernen.

Folgende Situation: Man schreibt mit dem Autor eine App, indem man am Ende ein Text in seine App vom Smartphone aus schreiben kann, drückt auf den Button und eine Computerstimme sagt den Text auf. Soweit so gut. Als ich bei dem Kapitel "Buttons Funktion geben" ankam, was auf Seite 117 beginnt, kam eine Fehlermeldung in Eclipse, die ich einfach nicht lösen kann. Das ist der bisherige Code:


```
package de.example.androidnewcommer.sagkhallo;

import java.util.Locale;

import android.app.Activity;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class StartActivity extends Activity implements OnInitListener{
	
	
	private TextToSpeech tts;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_start);
		tts = new TextToSpeech(this, this);
		
	}
	
	@Override 
	public void onInit(int arg0) {
		tts.setLanguage(Locale.GERMAN);
		Button button = (Button) findViewById(R.id.button1);
		button.setOnClickListener(this)
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.start, menu);
		return true;
	}
	public class StartActivity extends Activity implements OnInitListener,
	
	OnClickListener {
	public void onClick(View view) {
		EditText et = (EditText) findViewById(R.id.editText1);
		tts.speak(et.getText().toString(),
				TextToSpeech.QUEUE_FLUSH, null);
}
	
	}
	}
```

Eine Fehlermeldung erscheint bei dem "button.setOnClickListener(this);"- zu finden unter public void onInit (int arg0) { - , die jedoch verschwindet, wenn ich den Code so verändere: "button.setOnClickListener((OnClickListener) this);". Wurde mir von Eclipse vorgeschlagen.

Das andere Problem ist das zweite public class. Dort erscheint die Fehlermeldung "The nested type StartActivity cannot hide an enclosing type". Ich hatte im Internet recherchiert und dort wurde gesagt, dass es am Namen "StartActivity" liegen solle und man den Namen ändern müsste. Wenn ich den Code dann so umstelle:


```
package de.example.androidnewcommer.sagkhallo;

import java.util.Locale;

import android.app.Activity;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class StartActivity extends Activity implements OnInitListener{
	
	
	private TextToSpeech tts;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_start);
		tts = new TextToSpeech(this, this);
		
	}
	
	@Override 
	public void onInit(int arg0) {
		tts.setLanguage(Locale.GERMAN);
		Button button = (Button) findViewById(R.id.button1);
		button.setOnClickListener((OnClickListener) this);
	}
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.start, menu);
		return true;
	}
	public class khallo extends Activity implements OnInitListener,
	
	OnClickListener {
	public void onClick(View view) {
		EditText et = (EditText) findViewById(R.id.editText1);
		tts.speak(et.getText().toString(),
				TextToSpeech.QUEUE_FLUSH, null);
}

	@Override 
	public void onInit(int arg0) {
		tts.setLanguage(Locale.GERMAN);
		Button button = (Button) findViewById(R.id.button1);
		button.setOnClickListener((OnClickListener) this);
	}
	
	}
	}
```

Startet die App im Smartphone, wird aber sofort beendet. Was mache ich bloß falsch?

Es tut mir Leid, dass ich so viel Text geschrieben habe, aber wollte alles so klar wie möglich darstellen.

Mit freundlichen Grüßen 
Khaleed


----------



## eRaaaa (3. Dez 2013)

zu 1.) also du scheinst noch gar nicht zu verstehen wie das generell funktioniert. Der Code macht so gar keinen Sinn, vor allem die letzten Zeilen nicht da du da wieder eine neue Klasse definierst. Erst einmal solltest du zusätzlich den OnClickListener implementieren und importieren. 

```
import java.util.Locale;
import android.app.Activity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;   <------
import android.widget.Button;

public class StartActivity extends Activity implements OnInitListener, OnClickListener <---- {

	private TextToSpeech tts;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		 setContentView(R.layout.activity_start);
		tts = new TextToSpeech(this, this);

	}

	@Override 
    public void onInit(int arg0) {
        tts.setLanguage(Locale.GERMAN);
        Button button = (Button) findViewById(R.id.button1);
        button.setOnClickListener(this); <-- die zeile sollte dann gehen!
    }

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.start, menu);
		return true;
	}
---->
	@Override
	public void onClick(View arg0) {
		EditText et = (EditText) findViewById(R.id.editText1);
		tts.speak(et.getText().toString(), TextToSpeech.QUEUE_FLUSH, null);
	}
<-----
}
```


zu 2.) eine public class kann nur in einer eigenen Datei stehen (Grundlagen Java-Programmierung)


----------



## Khaleed (3. Dez 2013)

Super!

Ich hatte mich dauernd gefragt, wie ich das "OnClickListener" implementieren soll. Danke dir!


----------



## dzim (3. Dez 2013)

Oder halt per Externe, Anonymer oder Innerer Klasse - je nach Einsatzzweck. Letzten Endes ist jeder Listener irgendwo fast immer entweder eine Implemenitierung eines Interfaces oder einer abstrakten Klasse...


----------

