2014-09-12 7 views
15

Ich habe Probleme, diesen Code zu verstehen. Ich bekomme hit findViewById wird das Button-Widget bekommen und dann wird es umgewandelt. Dann wird das btn verwendet, um die Methode setOnClickListener aufzurufen. Allerdings weiß ich nicht, was dieses Argument an den setOnClickListener weitergegeben hat und ich habe noch nie Code wie diesen gesehen. Wie kommt es, dass es ein neues Objekt erstellt, aber in der Lage ist, eine eigene Methode innerhalb des Arguments einer anderen Methode zu erstellen? Wäre toll wenn jemand das erklären könnte. Welchen Objekttyp verwendet die setOnClickListener-Methode?Android - setOnClickListener Methode, wie funktioniert es?

btn = (Button)findViewById(R.id.firstButton); 
btn.setOnClickListener(new View.OnClickListener() 
{ 
    @Override 
    public void onClick(View v) 
    { 
     tv.setText(months[rand.nextInt(12)]); 
     tv.setTextColor(Color.rgb(rand.nextInt(255)+1, rand.nextInt(255)+1, rand.nextInt(255)+1)); 
    } 
}); 
+0

innerhalb des toat setzen und überprüfen –

+0

Es ist eine Instanz einer anonymen Klasse bereitstellt, die konform die Schnittstelle View.OnClickListener. –

+0

Ich hoffe, diese Lektion hilft Ihnen https://www.youtube.com/watch?v = Xl1x8eazbrM & ebc = ANyPxKr7uanNpJyW2UNvdSJGe6icStfh8ACnAf-yZZDe1EbQvjhb60XEnHPj9WU_Kd7c2lbfLfRiYW09jVdQtXnRH6IwhcafSA –

Antwort

10

Es funktioniert so. View.OnClickListenere definiert -

public interface OnClickListener { 
    void onClick(View v); 
} 

Soweit wir wissen, können Sie nicht ein Objekt OnClickListener instanziiert, da es kein Verfahren implementiert hat. So gibt es zwei Möglichkeiten, wie Sie durch gehen kann - Sie diese Schnittstelle implementieren kann, die onClick Methode wie folgt überschreiben:

public class MyListener implements View.OnClickListener { 
    @Override 
    public void onClick (View v) { 
     // your code here; 
    } 
} 

Aber es ist mühsam es jedes Mal zu tun, wie Sie einen Klick Zuhörer festlegen möchten. Um dies zu vermeiden, können Sie die Implementierung der Methode vor Ort bereitstellen, genau wie in einem Beispiel, das Sie angegeben haben.

setOnClickListener nimmt View.OnClickListener als Parameter.

+1

Ehrfürchtige Erklärung !! Macht jetzt vollkommen Sinn und lernte etwas Neues !! Ich wusste nie, dass Sie ein Objekt einer Schnittstelle instanziieren können, indem Sie seine Methode vor Ort implementieren. Sehr cool. – rayleigh

+0

Was ist das Argument der Methode "setOnClickListener"? – user72829

+0

Wenn Sie mehr über Observer Design Pattern lesen möchten :) – YTerle

0

Das, was manuelle says über setOnClickListener Methode ist:

public void setOnClickListener (View.OnClickListener l) 

Added in API-Ebene 1 einen Rückruf registriert aufgerufen werden, wenn diese Ansicht geklickt wird. Wenn diese Ansicht nicht anklickbar ist, wird sie anklickbar.

Parameter

l View.OnClickListener: Der Rückruf, der

laufen wird und normalerweise Sie es wie dieser

public class ExampleActivity extends Activity implements OnClickListener { 
    protected void onCreate(Bundle savedValues) { 
     ... 
     Button button = (Button)findViewById(R.id.corky); 
     button.setOnClickListener(this); 
    } 

    // Implement the OnClickListener callback 
    public void onClick(View v) { 
     // do something when the button is clicked 
    } 
    ... 
} 

Werfen Sie einen Blick verwenden in dieser Lektion auch Building a Simple Calculator using Android Studio.

0

Dies ist die beste Methode zur Implementierung von Onclicklistener für viele Schaltflächen in einer Reihe implementieren View.onclicklistener.

public class MainActivity extends AppCompatActivity **implements View.OnClickListener** { 

Dies ist eine Schaltfläche in der mainactivity

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

bt_submit = (Button) findViewById(R.id.submit); 

bt_submit.setOnClickListener(this); 

Dies ist ein ovveride Methode

@Override 
    public void onClick(View view) { 
     switch (view.getId()){ 
      case R.id.submit: 
       //action 

       break; 

      case R.id.secondbutton: 
       //action 
       break; 
     } 
    } 
Verwandte Themen