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

时间:2016-04-07 16:48:19

标签: java android oop onclick onclicklistener

我不知道这些是什么,但我想改变这样的事情:

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

代码不是"嵌套"在这样的论点里面。换句话说,我的想法是:

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方法中积累了很多代码。

4 个答案:

答案 0 :(得分:3)

由于您需要覆盖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);
        }
    });
}

答案 1 :(得分:2)

方法fab.setOnClickListener()期待一个View.OnClickListener的对象。

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

的事情
fab.setOnClickListener(new MyOnClickListener()); 

另一种选择是使用lambdas,如

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

答案 2 :(得分:0)

如果您使用的是Java 8,则可以编写

class A {
protected:
    void foo() {}
};

class B : public A {
    friend class C;
};

class C {
    void func() {
        B b;
        b.foo();
    }
};

如果不是,您可以在View.OnClickListener中调用fab.setOnClickListener(ClassName::onClickMethodForOnClickListenerOrSomething);

答案 3 :(得分:0)

你有一个OnClickListener接口。该接口应该由View(或其派生)实现。您问题中的第一个示例是界面的内联实现。我假设您想将其更改/移动到在其自己的类中实现它的视图。像这样:

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);