9

那么如何将一个函数作为参数传递给另一个函数,例如我想传递这个函数:

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();
}
4

4 回答 4

21

您可以使用 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();
            }
          });
}
于 2012-10-18T13:16:22.923 回答
3

好吧,因为在 Java 中没有代表(哦 C#,我好想你),你可以这样做的方法是创建一个实现接口的类,可能是可运行的或一些自定义接口,然后你可以通过接口调用你的方法.

于 2012-10-18T13:16:51.550 回答
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();
   ...
于 2012-10-18T13:15:39.960 回答
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);

就是这样。快乐的大思想...

于 2016-05-04T08:18:21.353 回答