如何将内部函数改成自己的函数?

How to change internal functions into their own functions?

我不知道这些叫什么,但我想改变这样的东西:

    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show();
        }
    });

变成代码不是 "nested" 那样的参数。换句话说,我的想法是:

fab.setOnClickListener(something goes here);

//...and then within its own method somewhere,

public void onClickMethodForOnClickListenerOrSomething(View view) {
    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show();
}

我不知道我是否说清楚了,但我基本上想将侦听器作为参数删除,并将其放入一个单独的函数中。我发现它使事情变得更清晰,因为有这么多的侦听器,我的 OnCreate 方法中积累了很多代码。

由于需要重写onClick方法,不能重命名,但可以如下操作:

public void onClickMethodForOnClickListenerOrSomething(View view) {
    Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
    .setAction("Action", null).show();
}

public void yourOtherMethod() {
  fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
          onClickMethodForOnClickListenerOrSomething(view);
        }
    });
}

如果你用的是Java 8 你可以只写

fab.setOnClickListener(ClassName::onClickMethodForOnClickListenerOrSomething);

如果你不是,你可以在 View.OnClickListener

中调用你的 onClickMethodForOnClickListenerOrSomething

方法 fab.setOnClickListener() 需要 View.OnClickListener 的对象。

因此,一种选择是创建一个新的 class,它从 View.OnClickListener 扩展并覆盖 onClick() 方法。然后你可以做类似

fab.setOnClickListener(new MyOnClickListener()); 

另一种选择是使用 lambda,例如

 fab.setOnClickListener((View view)->(Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                    .setAction("Action", null).show()));

您有一个接口,OnClickListener。该接口应该由视图(或其派生)实现。您问题中的第一个示例是接口的内联实现。我假设您希望 change/move 将其转换为在其自身 class 中实现它的视图。像这样:

public class Fab implements OnClickListener {

    @Override
    public void onClick(View v) { 
        Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
       .setAction("Action", null).show();
    }

}

用法:

Fab fab = new Fab()
fab.setOnClickListener(aView);