wie erfahre ich welches Steuerelement einen OnClickListener ausgelöst hat.

  • Antworten:19
  • Bentwortet
n00n
  • Forum-Beiträge: 19

08.01.2014, 05:15:06 via Website

Moin,

arbeite mich gerade in Android ein. Ich bin bisher eher unter php und C# zu Hause.
Also sind Java und Android noch recht neu für mich.

Als Lern-Hilfe habe ich das Galileo "Android Apps entwickeln für Einsteiger" gekauft.

Und gleich im 5. Kapitel ein Verständnis Problem:

1package de.dml.android.lernen.catchmoskitos;
2
3import android.app.Activity;
4import android.os.Bundle;
5import android.util.Log;
6import android.view.View;
7import android.view.View.OnClickListener;
8import android.widget.Button;
9
10public class MainScreen extends Activity implements OnClickListener{
11
12 private static String cName = "Moskito Game";
13 private Button cButton1;
14 private Button cButton2;
15
16 @Override
17 protected void onCreate(Bundle savedInstanceState){
18 Log.e(cName, "Activity has been started");
19 super.onCreate(savedInstanceState);
20 setContentView(R.layout.main);
21 Log.e(cName, "Content view has been set...");
22
23 cButton1 = (Button)findViewById(R.id.btnStart);
24 cButton1.setOnClickListener(this);
25
26 cButton2 = (Button)findViewById(R.id.btnEdit);
27 cButton2.setOnClickListener(this);
28 }
29
30 @Override
31 public void onClick(View v) {
32 // ??? wie erfahre ich nun welcher meiner Buttons betätigt wurde?
33 Log.e(cName,"button clicked");
34 }
35}

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

08.01.2014, 07:04:43 via App

Erkläre mal von dir aus was der Code machen soll bzw. macht.
Wenn du etwas nicht verstehst dann frage bitte genau.
Nur mit Code kann ich auch was anfangen aber das bringt dir nichts

Edit sorry velesen.
Du musst jetzt von deinem Objekt View die Aktuelle Id herausfinden und anhand dieser mit einer Switch die ids duchgehen.
bsp.
switch(view.getId())
case r.id.btn-1: break;
case r.id.btn-2: break;

— geändert am 08.01.2014, 07:11:28

LG Pascal //It's not a bug, it's a feature. :) ;)

n00n

Antworten
Michele
  • Forum-Beiträge: 1.525

08.01.2014, 08:20:02 via Website

Pascal P.

Edit sorry velesen.

Ja ja :P Erstmal selber richtig lesen :grin:
Spaß bei seite :D

Du machst es so wie Pascal sagte.

Etwa mit "switch" oder mit "if".

Natürlich ist für viele Buttons/IDs die "switch" besser.



LG

n00n

Antworten
Fabian Simon
  • Forum-Beiträge: 359

08.01.2014, 08:24:14 via Website

Das Obect von View das im formalparameter zur Verfügung steht. ist das View-Element (Steuerelement) das den OnClick Event ausgelöst hat.
so kannst du zum Beispiel mit einem Switch Case spezfisch die aktion bestimmten.

Hier ein kleines Beispiel:

1@Override
2 public void onClick(View v) {
3 switch (v.getId()){
4 case R.id.btnStart: {//mach was bei btn start}
5 break;
6 case R.id.btnEdit {//mach was bei btn edit}
7 }
8 }

Gruß
Fabian

n00n

Antworten
n00n
  • Forum-Beiträge: 19

08.01.2014, 13:31:30 via Website

Hi,

super das hat geholfen.

1package de.dml.android.lernen.catchmoskitos;
2
3import android.app.Activity;
4import android.content.Intent;
5import android.os.Bundle;
6import android.util.Log;
7import android.view.View;
8import android.view.View.OnClickListener;
9import android.widget.Button;
10
11public class MainScreen extends Activity implements OnClickListener{
12
13 private static String cName = "Moskito Game";
14 private Button cButton1;
15 private Button cButton2;
16
17 @Override
18 protected void onCreate(Bundle savedInstanceState){
19 Log.e(cName, "Activity has been started");
20 super.onCreate(savedInstanceState);
21 setContentView(R.layout.main);
22 Log.e(cName, "Content view has been set...");
23
24 cButton1 = (Button)findViewById(R.id.btnStart);
25 cButton1.setOnClickListener(this);
26
27 cButton2 = (Button)findViewById(R.id.btnEdit);
28 cButton2.setOnClickListener(this);
29 }
30
31 @Override
32 public void onClick(View aEventView) {
33 // ??? wie erfahre ich nun welcher meiner Buttons betätigt wurde?
34 switch(aEventView.getId()){
35 case R.id.btnStart:
36 Log.e(cName,"start clicked");
37 startActivity(new Intent(this, MainGame.class));
38 break;
39 case R.id.btnEdit:
40 Log.e(cName,"edit clicked");
41 break;
42 }
43
44 }
45}

Mir war nicht klar das ich *.getId() verwenden muss ....

Bei C# verwendete ich immer einen eigenen Event Handler, pro control:

— geändert am 08.01.2014, 13:34:31

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

08.01.2014, 15:45:29 via App

Das kannst du in Java auch machen nur das der ClickEvent Handler in c# jeweils einem OnClick listener entspricht.

LG Pascal //It's not a bug, it's a feature. :) ;)

n00n

Antworten
Fabian Simon
  • Forum-Beiträge: 359

08.01.2014, 16:10:46 via Website

Pascal P.
Das kannst du in Java auch machen nur das der ClickEvent Handler in c# jeweils einem OnClick listener entspricht.
Naja das stimmt so nicht ganz.
Das konzept ist ein anderes.
Zwar kann man in C# auch Listener verwenden aber meistens werden delegates verwendet.

n00n

Antworten
n00n
  • Forum-Beiträge: 19

08.01.2014, 17:36:30 via Website

Ja, Delegates,... Gibt es die in Java überhaupt?

Antworten
Fabian Simon
  • Forum-Beiträge: 359

09.01.2014, 08:25:58 via Website

impjor
Je nach Anwendungszweck sollte man aber interfaces verwenden können.
LG
Ein Interface ist nur ne Schnittstelle...
Meiner Meinung :
Jeder Listener ist eine Schnittstelle.
Aber nicht jede Schnittstelle ist ein Listener.



[................... Nur lesen wenn es nicht verwirrt( hat nix mit erben zu tun )............................]
Oder :D
Jeder Listener ist eine Art von Schnittstelle....

n00n

Antworten
Dietrich Gebert
  • Forum-Beiträge: 245

09.01.2014, 09:36:12 via Website

Ich finde es ehrlich gesagt nicht schön mit einem sozusagen globalen onClick Listener zu arbeiten, je nach app Größe kann es ziemlich
unübersichtlich werden + bei jedem onClick wird eine zusätzliche Methode ausgeführt (aEventView.getId()).

Ich würde vorschlagen du trennst das Ganze und definierst für jeden einzelnen Button einen eigenen onClick Listener.

Beispiel:
1Button button = (Button) findViewById(R.id.button);
2
3 button.setOnClickListener(new OnClickListener(){
4 @Override
5 //On click function
6 public void onClick(View view) {
7 // Hallo ich bin ein Platzhalter
8 }
9 });

So ist der Code sauber getrennt meiner Meinung nach.

Grüße
Dima

n00n

Antworten
Fabian Simon
  • Forum-Beiträge: 359

09.01.2014, 10:23:09 via Website

Dietrich Gebert

Ich würde vorschlagen du trennst das Ganze und definierst für jeden einzelnen Button einen eigenen onClick Listener.
Das sind innere Anonyme Klasse !
Das ist so ziemlich das unübersichtlichste was es gibt weil die Irgendwo im Quelltext definiert werden und es nicht eine klare Klasse gibt !
Wenn ein fremder Entwickler durch den Code durchblicken soll.
Bekommt man bei innere Anonyme Klasse Pickel !

Gruß
Fabian

n00n

Antworten
n00n
  • Forum-Beiträge: 19

09.01.2014, 10:28:25 via Website

Hi,

ich fand es auch nicht schön mit einem einzelnen onClickListener zu arbeiten. Aber der Ansatz wie Du empfiehlst hat in meinem Fall ein kleines Problem.

Statt
1@Override
2 public void onClick(View aEventView) {
3 // ??? wie erfahre ich nun welcher meiner Buttons betätigt wurde?
4 switch(aEventView.getId()){
5 case R.id.btnStart:
6 Log.e(cName,"start clicked");
7 startActivity(new Intent(this, MainGame.class));
8 break;
9 case R.id.btnEdit:
10 Log.e(cName,"edit clicked");
11 break;
12 }
13 }

müsste ich schreiben:
1cButton2.setOnClickListener(new OnClickListener(){
2 @Override //On click function
3 public void onClick(View view) {
4 Log.e(cName,"start clicked");
5 startActivity(new Intent(this, MainGame.class));
6 }
7 });

Nun will eclipse aber nicht mehr, denn "new Intent(this, MainGame.class)" ist ein "Problem" und merkwürdigerweise darf man ein Intent nicht mehr mit Parametern erzeugen. Einen Tip für mich? (Aus dem Buch lernt sich so was schlecht, aber hab hier keine Schulung dazu gefunden... )

LG n00n

Antworten
Fabian Simon
  • Forum-Beiträge: 359

09.01.2014, 11:59:33 via Website

Das kommt daher das er die Methode startActivity nicht mehr kennt.
Glaube die Kann man mit.
Klassenname.startActivity wiederbekommen.


Aber im ernst Anonyme inner Klassen. sind net das gelbe vom ei ...

— geändert am 09.01.2014, 12:00:11

n00n

Antworten
Michele
  • Forum-Beiträge: 1.525

09.01.2014, 13:19:58 via Website

Wenn kann man es noch so schreiben:

1public void ButtonOne() {
2Button button = (Button) findViewById(R.id.buttonOne);
3button.setOnClickListener(new View.OnClickListener() {
4public void onClick(View v) {
5
6
7
8}
9});
10}

So hat jeder Button seine eigene Methode oder ist in seiner eigenen.

Aber was Fabian schon sagte, stimmt auch.
Unübersichtlich und ist nicht das gelbe vom Ei.


LG

n00n

Antworten
impjor
  • Forum-Beiträge: 1.793

09.01.2014, 15:04:39 via App

Fabian Simon
impjor
Je nach Anwendungszweck sollte man aber interfaces verwenden können.
LG
Ein Interface ist nur ne Schnittstelle...
Meiner Meinung :
Jeder Listener ist eine Schnittstelle.
Aber nicht jede Schnittstelle ist ein Listener.



[................... Nur lesen wenn es nicht verwirrt( hat nix mit erben zu tun )............................]
Oder :D
Jeder Listener ist eine Art von Schnittstelle....
Ich habe nie behauptet, Interfaces wären Delegates in Java.
Aber man kann interfaces für Aufgaben verwenden, die man sonst mit Delegates gelöst hätte.


LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

n00n

Antworten
n00n
  • Forum-Beiträge: 19

13.01.2014, 09:37:13 via Website

Moin,

wenn ich Dein Beispiel einbaue, also im Beispiel von cButton3 einen eigenen onClickListener, dann kann ich die Activity mit einem Intent nicht mehr aufrufen. (btw was ist ein Intent in dem Kontext?)

Beispiel-Code:
1public class MainScreen extends Activity implements OnClickListener{
2
3 private static String cName = "Moskito Game";
4 private Button cButton1;
5 private Button cButton2;
6 private Button cButton3;
7
8 @Override
9 protected void onCreate(Bundle savedInstanceState){
10 Log.e(cName, "Activity has been started");
11 super.onCreate(savedInstanceState);
12 setContentView(R.layout.main);
13 Log.e(cName, "Content view has been set...");
14
15 cButton1 = (Button)findViewById(R.id.btnStart);
16 cButton1.setOnClickListener(this);
17
18 cButton2 = (Button)findViewById(R.id.btnEdit);
19 cButton2.setOnClickListener(this);
20
21 cButton3 = (Button)findViewById(R.id.btnExit);
22 cButton3.setOnClickListener(new OnClickListener(){
23 @Override
24 //On click function
25 public void onClick(View view) {
26 startActivity(new Intent(this, MainGame.class));
27 }
28 });
29 }
30
31 @Override
32 public void onClick(View aEventView) {
33 switch(aEventView.getId()){
34 case R.id.btnStart:
35 Log.e(cName,"start clicked");
36 startActivity(new Intent(this, MainGame.class));
37 break;
38 case R.id.btnEdit:
39 Log.e(cName,"edit clicked");
40 break;
41 }
42 }
43}

cu n00n

Antworten
n00n
  • Forum-Beiträge: 19

13.01.2014, 11:11:00 via Website

aaah.... cooool... so einfach, wenn man weis wie es geht.. *fg*

Für alle noch mal als Lösung:
1cButton3 = (Button)findViewById(R.id.btnExit);
2 cButton3.setOnClickListener(new OnClickListener(){
3 @Override
4 //On click function
5 public void onClick(View view) {
6 startActivity(new Intent(getApplicationContext(), MainGame.class));
7 }
8 });

Antworten