Android Ist das ein akzeptabler Code?

rahu2000

Mitglied
Hallo zusammen:),

ich bin erst seit kurzem beim Java-Programmieren und habe deshalb eine Frage zu meinem Code-Stil:
Java:
public void onCreate(Bundle savedInstanceState) 
	{	
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	
		myButton = (Button)findViewById(R.id.Button01);
		myButton2 = (Button)findViewById(R.id.Button02);
		myLabel = (TextView)findViewById(R.id.TextView01);
		
		setOnClickList(myButton);
		setOnClickList(myButton2);
	}
	
	public void setOnClickList(final Button but)
	{	
		but.setOnClickListener(new OnClickListener() 
		{
	        public void onClick(View v) 
	        {
	        	if (but == myButton) 
	        	{
	        		but.setText("Hellooo1!");
	        	}
	        	if (but == myButton2) 
	        	{
	        		but.setText("Hellooo2!");
	        	}
	        }
	      });
	}

Mir geht es vorallem um die "setOnClickList" - Methode, da ich nich weiß ob das vom Code her annehmbar oder furchtbar schrecklich ist. :D Denn in online-Codeschnipseln findet man das immer so:
Java:
myButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
myLabel.setText("Blabla");

}
});
und ich persönlich finde das unübersichtlich und hab das deshalb in eine extra-Methode gepackt (kommt vielleicht daher, dass ich vorher zu viel Visual Basic programmiert habe):)

Findet ihr -vorallem die erfahrenen Programmierer - , dass man das so lassen kann oder sollte ich das anders schreiben?

Vielen Dank für eure Meinung im Voraus und

mfG

rahu2000
 

mjdv

Bekanntes Mitglied
Generell solltest du den Objekten, also den Buttons sinnvolle Namen geben wie zB loginButton oder cancelButton.

Die Methode ist an sich ok, aber eigentlich macht sie nicht das was du glaubst was sie tut denke ich. Du erstellst zwei mal das OnClick Objekt, dh. eigentlich völlig sinnfrei.

Sowas zB wäre besser:

Java:
private OnClickListener myListener  = new OnClickListener() {
 
        @Override
        public void onClick(View v) 
            {
               int viewId = v.getId();
                if (viewId == R.id.button1) 
                {
                    but.setText("Hellooo1!");
                }
                if (viewId == R.id.button2) 
                {
                    but.setText("Hellooo2!");
                }
            }
}

Java:
...
but1.setOnClickListener(myListener);
but2.setOnClickListener(myListener);
...

Damit erstellst du den listener nur einmal.

Vll schaußt du dir das mit den Listenern bei Swing nochmal an. Da gibt es so viele verschiedene Möglichkeiten :D
 

Marco13

Top Contributor
Bei Android gelten wohl andere Regeln und Konventionen, als bei "normalem" Java. (Ja, es ist eigentlich das gleiche, und es funktioniert wohl beides auf die eine oder andere Weise, aber die "best practices" können doch unterschiedlich sein). Deswegen der Disclaimer vorweg: Das bezieht sich jetzt NICHT speziell auf Android!

Üblicherweise (bei "normalem" Java/Swing) ist IMHO und aus subjektiver Erfahrung heraus weniger das Anhängen des Listeners das kritische, sondern eher das, was der Listener macht.

Falls dort mehr gemacht wird als sowas wie [c]but.setText("Hellooo1!");[/c], dann sollte man das möglichst schnell in eine private Methode auslagern. Das gilt für beide Fälle: Sowohl für deine Lösung, als auch für das, was du als unübersichtlich bezeichnet hast.


Darüber hinaus... Erstmal abwarten, ob mich ein Android-Experte was dazu sagt :D Hier kommt nur noch subjektiv-unfundierter Kram:

Ich finde sowas wie
Java:
myButton.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        doSomething();
    }
});
gar nicht so unübersichtlich: Man sieht direkt, dass ein Klick auf "myButton" einen Aufruf von "doSomething" bewirkt. Dieses Herstellen der Verbindung zwischen Button und Funktion steht so im Code sehr kompakt an einer Stelle. Bei der von dir vorgeschlagenen Lösung muss der Anonyme OnClickListener immer wissen, auf welche Buttons er hört, und welche er prüfen muss - die Wartung dieses Listeners könnte bei "vielen" Buttons irgendwann unübersichtlich werden.
Mit Java8 wird sich das ganze dann ja voraussichtlich in sowas wie
Java:
myButton.setOnClickListener( #doSomething(); );
verwandeln.... :reflect:
 

rahu2000

Mitglied
Vielen Dank für die Antworten.
Ich habe eine Frage zu mjdv's Vorschlag:

Der Compiler gibt nur Ruhe wenn ich die
Code:
private OnClickListener myListener..,
-Methode mit einem ";" abschließe. - Wieso?

mfG

rahu2000

PS: @ Marco13: Du hast recht wenn ichs mir so überlege wird es doch unübersichtlicher mit steigender Anzahl an Buttons und längerem Quellcode...:D
 

mjdv

Bekanntes Mitglied
Stimmt hab ich vergessen sry.

Naja es ist eigentlich ein ganz normales instanziieren eines Objekts. Wie als wenn du Object o = new Object(); machst, da muss ja auch das ';' hin. Da es sich hier aber eben um ein Interface handelt musst du eben ncoh die Methoden entsprechend implementieren.
 

fastjack

Top Contributor
Die vielen if's würde ich erstmal durch else if(...) ersetzen, da sonst alles durchgeprüft wird und es kann ja nur ein Button geklickt sein.

edit: Die Java-Code-Conventions darf man auch in Android-Programmen nutzen
 

schlingel

Gesperrter Benutzer
Wie Eingangs erwähnt, gibt es Unterschiede in der Entwicklung für Android u. Java SE/EE. In deinem Beispiel finde ich den Umweg unnötig.

Entweder du erzeugst für beide Buttons einen individuellen Handler oder du implementierst in der Activity-Klasse den Handler. Damit würdest du dir Objekte sparen. Geht allerdings ein wenig auf Kosten der Lesbarkeit.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N "Schöne" Datatable in Android und setzen von Parametern von Textview im Code Android & Cross-Platform Mobile Apps 5
S onClickListener auf Buttons die im Code erzeugt wurden setzen. Android & Cross-Platform Mobile Apps 8
W Code läuft unter SDK 27 aber nicht SDK 30 Android & Cross-Platform Mobile Apps 17
M QR-Code auslesen mit Tabletkamera Android & Cross-Platform Mobile Apps 3
C Auf Play Store verlinken - Code in einer Extraklasse Android & Cross-Platform Mobile Apps 1
D HTML Code von Website abrufen Android & Cross-Platform Mobile Apps 26
K Android Code so OK? Android & Cross-Platform Mobile Apps 0
C Android Code in mehrere .java verteilen Android & Cross-Platform Mobile Apps 6
S Android Speichern von Informationen in Code oder extern Android & Cross-Platform Mobile Apps 0
M Code effizienter machen Android & Cross-Platform Mobile Apps 16
R Android YouTube Video per Code streamen Android & Cross-Platform Mobile Apps 5
P Brauche Hilfe bei Code Snippet Android & Cross-Platform Mobile Apps 10
L Android Android über Java Code connecten? Android & Cross-Platform Mobile Apps 2
A Android Android-Code.de - Das Android-Entwickler Forum Android & Cross-Platform Mobile Apps 3
H Mjpeg Code läuft unter Java jedoch nicht unter Android? Android & Cross-Platform Mobile Apps 11
J Android QR-Code Scanner mit OpenCV/JavaCV Android & Cross-Platform Mobile Apps 1
P J2ME Code-Beispiele Android & Cross-Platform Mobile Apps 2
2 Code ineffizient? Android & Cross-Platform Mobile Apps 6
H HELP! Code verbessern? Android & Cross-Platform Mobile Apps 3

Ähnliche Java Themen

Neue Themen


Oben