it-swarm.com.de

Android OnClickListener - Identifizieren Sie eine Schaltfläche

Hallo. Ich habe die Aktivität:

public class Mtest extends Activity {
  Button b1;
  Button b2;
  public void onCreate(Bundle savedInstanceState) {
    ...
    b1 = (Button) findViewById(R.id.b1);
    b2 = (Button) findViewById(R.id.b2);
    b1.setOnClickListener(myhandler);
    b2.setOnClickListener(myhandler);
    ...
  }
  View.OnClickListener myhandler = new View.OnClickListener() {
    public void onClick(View v) {
      // MY QUESTION STARTS HERE!!!
      // IF b1 do this
      // IF b2 do this
      // MY QUESTION ENDS HERE!!!
    }
  }
}

Wie überprüfe ich, auf welche Schaltfläche geklickt wurde?

134
xpepermint

Sie werden auf einfache Weise lernen, wie dies funktioniert:

public class Mtest extends Activity {
  Button b1;
  Button b2;
  public void onCreate(Bundle savedInstanceState) {
    ...
    b1 = (Button) findViewById(R.id.b1);
    b2 = (Button) findViewById(R.id.b2);
    b1.setOnClickListener(myhandler1);
    b2.setOnClickListener(myhandler2);
    ...
  }
  View.OnClickListener myhandler1 = new View.OnClickListener() {
    public void onClick(View v) {
      // it was the 1st button
    }
  };
  View.OnClickListener myhandler2 = new View.OnClickListener() {
    public void onClick(View v) {
      // it was the 2nd button
    }
  };
}

Wenn Sie mit nur einem Clicklistener arbeiten, können Sie Folgendes tun:

View.OnClickListener myOnlyhandler = new View.OnClickListener() {
  public void onClick(View v) {
      switch(v.getId()) {
        case R.id.b1:
          // it was the first button
          break;
        case R.id.b2:
          // it was the second button
          break;
      }
  }
}

Dies wird jedoch nicht empfohlen, da Sie für jede von Ihnen verwendete Schaltfläche ein if hinzufügen müssen. Das ist schwer zu pflegen.

197
Cristian

Oder Sie können das Gleiche versuchen, aber ohne Zuhörer. Auf Ihrer Schaltfläche XML-Definition:

Android:onClick="ButtonOnClick"

Und in Ihrem Code definieren Sie die Methode ButtonOnClick:

public void ButtonOnClick(View v) {
    switch (v.getId()) {
      case R.id.button1:
        doSomething1();
        break;
      case R.id.button2:
        doSomething2();
        break;
      }
}
76
Chronos

Ich bevorzuge:

class MTest extends Activity implements OnClickListener {
    public void onCreate(Bundle savedInstanceState) {
    ...
    Button b1 = (Button) findViewById(R.id.b1);
    Button b2 = (Button) findViewById(R.id.b2);
    b1.setOnClickListener(this);
    b2.setOnClickListener(this);
    ...
}

Und dann:

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.b1:
            ....
            break;
        case R.id.b2:
            ....
            break;
    }   
}

Switch-case ist einfacher zu pflegen als if-else, und für diese Implementierung müssen nicht viele Klassenvariablen erstellt werden.

42
Saad Farooq

Fünf Möglichkeiten, einen Ereignis-Listener einzurichten ist ein großartiger Artikel, der einen Überblick über die verschiedenen Möglichkeiten zum Einrichten eines einzelnen Ereignis-Listeners gibt. Lassen Sie mich das hier für mehrere Hörer erweitern.

1. Mitgliederklasse

public class main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //attach an instance of HandleClick to the Button
        HandleClick handleClick = new HandleClick();
        findViewById(R.id.button1).setOnClickListener(handleClick);
        findViewById(R.id.button2).setOnClickListener(handleClick);
    }    
    private class HandleClick implements OnClickListener{
        public void onClick(View view) {
            switch(view.getId()) {
            case R.id.button1:
                // do stuff
                break;
            case R.id.button2:
                // do stuff
                break;
            }
        }
    }
}

2. Schnittstellentyp

public class main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.button1).setOnClickListener(handleClick);
        findViewById(R.id.button2).setOnClickListener(handleClick);
    }
    private OnClickListener handleClick = new OnClickListener() {
        public void onClick(View view) {
            switch (view.getId()) {
            case R.id.button1:
                // do stuff
                break;
            case R.id.button2:
                // do stuff
                break;
            }
        }
    };
}

3. Anonyme innere Klasse

public class main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                // do stuff
            }
        });
        findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                // do stuff
            }
        });
    }
}

4. Implementierung in Aktivität

public class main extends Activity implements OnClickListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
    }
    public void onClick(View view) {
        switch (view.getId()) {
        case R.id.button1:
            // do stuff
            break;
        case R.id.button2:
            // do stuff
            break;
        }
    }
}

5. Attribut im Ansichtslayout für OnClick-Ereignisse

public class main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    public void HandleClick(View view) {
        switch (view.getId()) {
        case R.id.button1:
            // do stuff
            break;
        case R.id.button2:
            // do stuff
            break;
        }
    }
}

Und in xml:

<Button
    Android:id="@+id/button1"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:onClick="HandleClick" />
<Button
    Android:id="@+id/button2"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:onClick="HandleClick" />
15
Suragch

Eine andere Möglichkeit, dies zu tun, ist ein einzelner Listener aus der Aktivität:

public class MyActivity extends Activity implements OnClickListener {
    .......  code

    //my listener
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.mybutton) { 
            DoSomething();
            return;
        }

        if (v.getId() == R.id.mybutton2) { 
            DoSomething2();
            return;
        }
    }
}

Ich mache es gerne mit einer einzelnen IF anstelle von switch-else, aber wenn Sie das vorziehen, sollten Sie Folgendes tun:

//my listener
@Override
public void onClick(View v) {
    switch(v.getId()) {
        case R.id.mybutton:
        { 
             DoSomething();
             break;
        }

        case R.id.mybutton2:
        {
            DoSomething();
            break;
        }
    }
}
12
ruhalde

Wenn Sie keine Instanzen der Schaltfläche 2 im Klassencode speichern möchten, gehen Sie BESSER vor (dies ist klarer und schneller !!):

public void buttonPress(View v) {
  switch (v.getId()) {
    case R.id.button_one:
        // do something
        break;
    case R.id.button_two:
        // do something else
        break;
    case R.id.button_three:
        // i'm lazy, do nothing
        break;
  }
}
12
lory105

Der beste Weg ist durch switch - zwischen v.getId (). Wenn für jeden Button ein separater anonymer OnClickListener vorhanden ist, wird mehr Speicher belegt. Das Übertragen der Ansicht auf die Schaltfläche ist nicht erforderlich. Die Verwendung von if-else, wenn ein Wechsel möglich ist, ist langsamer und schwerer zu lesen. In der Android-Quelle können Sie häufig feststellen, dass Sie die Referenzen mit if-else vergleichen:

if (b1 == v) {
 // ...
} else if (b2 == v) {

Ich weiß nicht genau, warum sie diesen Weg gewählt haben, aber es funktioniert auch.

9
ognian

benutze setTag ();

so was:

@Override    
public void onClick(View v) {     
    int tag = (Integer) v.getTag();     
    switch (tag) {     
    case 1:     
        System.out.println("button1 click");     
        break;     
    case 2:     
        System.out.println("button2 click");     
       break;   
    }     
}     
7
user2644305

Zusätzlich zur Antwort von Cristian C (Entschuldigung, ich kann keine Kommentare abgeben) können Sie, wenn Sie einen Handler für beide Schaltflächen erstellen, v direkt mit b1 und b2 vergleichen, oder wenn Sie anhand der ID vergleichen möchten, Sie Sie müssen v nicht in Button umwandeln (View hat auch die Methode getId ()), und auf diese Weise besteht keine Gefahr einer Ausnahmebedingung.

4
DonSteep
Button mybutton = new Button(ViewPagerSample.this);
mybutton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
            // TODO Auto-generated method stub
    }
});
4
Tai Nguyen
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(this);

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    if(v.getId() == R.id.button1){
        Toast.makeText(context, "Button 1 Click", Toast.LENGTH_LONG).show();
    }
}

Weitere Informationen finden Sie in diesem Artikel

1
user7925882