2012-10-18 34 views
7

所以,我怎麼能傳遞一個函數作爲參數傳遞給另一個函數,例如我想通過這個功能:如何將一個函數作爲參數傳遞給android中的另一個函數?

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

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

函數不是Java中的頭等對象。除此之外,爲什麼你不能在需要的地方簡單地調用你想要的方法呢? – Makoto

+0

爲此使用接口。一些例子:http://www.javaworld.com/javatips/jw-javatip10.html –

+0

使該方法所屬類的對象,並簡單地在對話框中調用它與對象引用 –

回答

15

您可以使用一個Runnable來包裝你的方法:

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

然後將它傳遞給你的方法,並呼籲r.run();在你需要它:

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

謝謝,這工作正常 – nexusone

+0

如果我需要返回值呢? – rocketspacer

+1

@nmtuan使用Callable? – assylias

2

函數不能直接傳遞自己。您可以使用interface實現作爲回調機制來進行呼叫。

接口:

public interface MyInterface { 

    public void testFunkcija(); 
} 

實現:

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

,並通過它MyInterfaceImpl實例作爲要求:

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

    myInterface.testFunkcija(); 
    ... 
3

那麼,既然在Java中沒有dellegates(哦,C#我想念你這麼壞的),你可以做的方式它正在創建一個實現接口的類,可能是可運行的或一些自定義接口,並且可以通過接口調用您的方法。

0

最簡單的方法是使用runnable 讓我們來看看

//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"); 
} 
現在

如何讓我們來看看我如何可以傳遞任何功能它(我不會用lambda表達式)

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

讓我們通過另功能

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

thas's it。快樂的大思維......

相關問題