2016-07-04 9 views
2

Ich habe eine Klasse namens BuyCoins, innerhalb dieser Klasse habe ich eine Methode addListenerOnSpinnerItemSelection()Rückruf-Funktion java

public void addListenerOnSpinnerItemSelection() { 
    spinner1 = (Spinner) findViewById(R.id.spinner1); 
    TextView t=(TextView) findViewById(R.id.conversion); 
    CustomOnItemSelectedListener c = new CustomOnItemSelectedListener(t); 
    spinner1.setOnItemSelectedListener(c); 
    //String stockCode=c.getStock(); 
    //Log.d(TAG,"message"); 
} 

Dadurch entsteht ein neues Objekt, das das Element erkennt (Produkt) auf dem Spinner ausgewählt. Ich möchte dies gerne wieder in die BuyClass geben. Ich habe versucht, dies mit den Zeilen zu tun, die auskommentiert sind, aber der Wert, den ich zurück erhalte, ist null.

public class CustomOnItemSelectedListener implements OnItemSelectedListener { 

... 
public String Stock; 

... 

public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) { 

    String selected=parent.getItemAtPosition(pos).toString(); 

    switch(selected) { 
     case "20 Coins": 
      Toast.makeText(parent.getContext(), 
      "OnItemSelectedListener : " + selected, 
      Toast.LENGTH_SHORT).show(); 
      t.setText("$20"); 
      this.setStock("20Coins"); 
      break; 
    ... 
    } 

    private void setStock(String s) { 
     Stock=s; 
    } 

    public String getStock() { 
     return Stock; 
    } 

} 
+0

'der Wert I zurückerhalten ist ein null' - wenn Sie etwas zurück Ihre Methode senden möchten einen Rückgabetyp haben muss (Ihres ist nichtig, also nichts), einen Wert _into_ schreiben ein Objekt, das als Parameter übergeben wurde oder den Wert in ein Feld schreibt, das nach dem Methodenaufruf gelesen werden kann. Sofern Sie nicht wissen, was Sie tun, würde ich Optionen 2 und 3 für Sie nicht empfehlen (es könnte Nebenwirkungen geben, mit denen Sie nicht umgehen können). – Thomas

+0

Außerdem, wenn Sie gerade den Listener hinzugefügt haben, wie sollte 'c.getStock();' _any_ value zurückgeben? 'onItemSelected()' konnte zu diesem Zeitpunkt nicht aufgerufen werden. – Thomas

+0

hi, ich bin mir nicht sicher was du sagst .. String stockCode = c.getStock(); gibt null zurück. Die Methode "getStock" hat einen Rückgabetyp von String –

Antwort

0

Das Problem ist, dass Sie den Hörer direkt nach dem Hinzufügen abfragen, d. H. Das Ereignis kann möglicherweise noch nicht passiert sein. Da Sie nicht wissen, , wenn die gerade passiert (wenn überhaupt) müssen Sie das entkoppeln.

Beispiel (einfache Pseudo-Code, die Sie gerade zu beginnen):

class Model { 
    String stock; 
} 

class Listener { 
    Model model; 

    Listener(Model m) { 
    model = m; 
    } 

    //In your case Component might be the spinner or its parent, depending on the rest of your code 
    void onItemSelected(Component c) { 
    m.stock = c.getText(); 
    } 
} 

Und wenn Sie erstellen und registrieren Sie den Hörer:

class BuyCoins { 
    Model model; //initialize 

    ... 

    void initListeners() { 
    spinner.addListener(new Listener(model)); 
    } 
} 
+0

vielen Dank .. schnell durcharbeiten –

+0

immer noch kämpfen .. der addListner ist zusätzlich zu spinner1.setOnItemSelectedListener (c), also, wenn ich richtig verstehe, fügen Sie zusätzliche Ereignis-Listener zum Spinner –

+0

@the_big_blackbox keine 'addListener() 'würde in Ihrem Fall' SetOnItemSelectedListener() 'bedeuten. Wie gesagt, es ist nur Pseudo-Code (in den meisten Fällen können Sie mehrere Listener hinzufügen, daher das "add" - aber wenn nur ein Listener eines Typs erlaubt ist, ist "set" auch in Ordnung). – Thomas

0

Vielen Dank an alle, gelang es, indem es das zu lösen zu einem späteren Ereignis folgen.

public void onBuyCoinButtonClicked(View arg0) { 

    spinner1 = (Spinner) findViewById(R.id.spinner1); 
    String product= spinner1.getSelectedItem().toString(); 
    Toast.makeText(this, 
      "product : " + product, 
      Toast.LENGTH_SHORT).show(); 

Einfache Abhilfe

Verwandte Themen