2016-12-31 7 views
1

Im Folgenden ein Beispiel für meine App MainActivity.java ist:ein Objekt von MainActivity durch View.OnClickListener Passing()

/*imports and other stuffs*/ 

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

Button myButton; 

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

    myButton = (Button) findViewById(R.id.first_button); 
    // myButton.setOnClickListener(this); by using it, app works as desired. 


    myButton.setOnClickListener(new MainActivity()); //What's wrong with this piece of codes? 

} 

@Override 
public void onClick(View v) { 
    if(v.getId()==R.id.first_button){ 
     Toast.makeText(this, "Made it", Toast.LENGTH_SHORT).show(); 
    } 

} 

Als setOnClickListener() -Methode ein Objekt einer Klasse erfordert, die View.setOnClickListener implementiert, es kann mit einer benutzerdefinierten Klasse behandelt werden implementiert View.setOnClickListener, aber meine Frage, wie ein Anfänger, was ist eigentlich los, während ein Objekt von MainActivity übergeben?

Edit:

Aber wenn ich ein Objekt einer anderen Klasse übergeben und dass man passieren, der Code funktioniert perfekt, nicht wahr? und was ist mit den Codes:

public class MainActivity extends AppCompatActivity { 
Button myButton; 

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

    myButton = (Button) findViewById(R.id.first_button); 


    myButton.setOnClickListener(new MyClass()); 


} 

class MyClass implements View.OnClickListener{ 

    @Override 
    public void onClick(View v) { 
     Log.d("buttontest","Working Perfectly"); 
    } 
} 

}

+0

Wenn Sie möchten, dass Ihre aktuelle Aktivität mit Klicks fertig wird, übergeben Sie einfach "this". Das Übergeben einer neuen Instanz von Aktivitäten wird Ihnen nicht gut tun. Sie sollten OS Aktivitäten für Sie erstellen lassen und nicht selbst spawnen –

+0

@OlegBogdanov das ist was Ich mache es, aber ich kann es nicht herausfinden, was hier Probleme verursacht. –

+0

aber Sie haben vergessen zu sagen, was das Problem ist –

Antwort

0
myButton.setOnClickListener(new MainActivity()); 

Mit diesem Stück Code, den Sie auf OnClickListener für Ihre myButton setzen. Sie erstellen jedoch nicht das richtige Listener-Objekt. Sie erstellen ein neues MainActivity-Objekt, das nicht der richtige Typ ist. Diese

myButton.setOnClickListener(this); 

ist korrekt, denn die Klasse implementiert View.OnClickListener und hat die Umsetzung mit dem Leere onClick (Blick v) Methode in der Klasse.

Sie können dies auch tun, wenn Sie auch mögen:

myButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // add code here 
      } 
     }); 

Dies wird ein neues OnClickListener Objekt mit dem Verfahren, wie gut umgesetzt onClick erstellen. Dadurch wird eine anonyme Klasse an den setOnClickListener übergeben.

+0

Würden Sie bitte klären, was ist der Unterschied zwischen der Übergabe eines Objekts der MainActivity-Klasse (wie es View.SetOnClickListener implementiert) und diese übergeben? –

+0

'this' bezieht sich auf das aktuelle Objekt. In Ihrem Beispiel bezieht es sich auf die 'MainActivity'. Dies funktioniert, weil Ihre 'MainActivity' die' View.OnClickListener' Schnittstelle implementiert. – Orbit

+0

@Orbit dies bezieht sich auf das aktuelle Objekt von MainActivity und MainActivity implementiert View.OnClickListener, immer noch ein Objekt dieser Klasse tatsächlich Probleme in meiner App, jedoch ein Objekt jeder Klasse, außer MainActivity, funktioniert perfekt, kann jemand mich wissen lassen Was ist hier falsch? –

Verwandte Themen