2012-10-18 15 views
7

Così come posso passare una funzione come parametro a un'altra funzione, ad esempio, voglio passare questa funzione:Come posso passare una funzione come parametro ad un'altra funzione in Android?

public void testFunkcija(){ 
    Sesija.forceNalog(reg.getText().toString(), num); 
} 

in questo:

public static void dialogUpozorenjaTest(String poruka, Context context, int ikona, final Method func){ 
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
      context); 
     alertDialogBuilder.setTitle("Stanje..."); 
     alertDialogBuilder 
      .setMessage(poruka) 
      .setIcon(ikona) 
      .setCancelable(true)       
      .setPositiveButton("OK",new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog,int id) { 
        //here 
       } 
       }); 

     AlertDialog alertDialog = alertDialogBuilder.create(); 
     alertDialog.show(); 
} 
+0

Le funzioni non sono oggetti di prima classe in Java. Oltre a questo, perché non potresti semplicemente chiamare il metodo desiderato dove ne hai bisogno? – Makoto

+0

Usa le interfacce per questo. Alcuni esempi: http://www.javaworld.com/javatips/jw-javatip10.html –

+0

crea un oggetto della classe a cui appartiene il metodo e chiamalo semplicemente all'interno della finestra di dialogo con riferimento all'oggetto –

risposta

15

È possibile utilizzare un Runnable per avvolgere il metodo:

Runnable r = new Runnable() { 
    public void run() { 
     Sesija.forceNalog(reg.getText().toString(), num); 
    } 
} 

poi passarlo al metodo e chiamare r.run(); dove serve:

public static void dialogUpozorenjaTest(..., final Runnable func){ 
    //..... 
     .setPositiveButton("OK",new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog,int id) { 
       func.run(); 
      } 
      }); 
} 
+0

grazie, questo funziona bene – nexusone

+0

e se ho bisogno di un valore di ritorno? – rocketspacer

+1

@nmtuan Usa un riscattabile? – assylias

2

Le funzioni non possono essere passati direttamente se stessi. È possibile utilizzare un'implementazione interface come meccanismo di callback per effettuare la chiamata.

Interfaccia:

public interface MyInterface { 

    public void testFunkcija(); 
} 

Implementazione:

public class MyInterfaceImpl implements MyInterface 
    public void testFunkcija(){ 
     Sesija.forceNalog(reg.getText().toString(), num); 
    } 
} 

e passarlo un'istanza MyInterfaceImpl come richiesto per:

public static void dialogUpozorenjaTest(MyInterface myInterface, ...) 

    myInterface.testFunkcija(); 
    ... 
3

Beh, visto che non ci sono dellegates in Java (oh C# Mi manchi così male), il modo in cui si può fare sta creando una classe che implementa un'interfaccia, magari eseguibile o qualche interfaccia personalizzata e che puoi chiamare il tuo metodo attraverso l'interfaccia.

0

il modo più semplice sta usando runnable vediamo come

//this function can take function as parameter 
private void doSomethingOrRegisterIfNotLoggedIn(Runnable r) { 
    if (isUserLoggedIn()) 
     r.run(); 
    else 
     new ViewDialog().showDialog(MainActivity.this, "You not Logged in, please log in or Register"); 
} 

ora vediamo come posso passare qualsiasi funzione che esso (non voglio usare un'espressione lambda)

Runnable r = new Runnable() { 
       @Override 
       public void run() { 
        startActivity(new Intent(MainActivity.this, AddNewPostActivity.class)); 
       } 
      }; 
doSomethingOrRegisterIfNotLoggedIn(r); 

passiamo un'altra funzione

Runnable r = new Runnable() { 
       @Override 
       public void run() { 
        if(!this.getClass().equals(MyProfileActivity.class)) { 
         MyProfileActivity.startUserProfileFromLocation(MainActivity.this); 
         overridePendingTransition(0, 0); 
        } 
       } 
      }; 
doSomethingOrRegisterIfNotLoggedIn(r); 

questo è tutto. felice grande pensiero ...

Problemi correlati