2009-12-29 66 views
11

我看到的大多数示例似乎都是在像button.setOnClickListener()这样的调用中使用匿名方法的。相反,我想传递一个在我正在使用的Activity类中定义的方法.C#中以下事件处理程序接线的Java/Android等效物是什么?Android - 如何在button.setOnClickListener()中设置一个命名方法

Button myButton = new Button(); 
myButton.Click += this.OnMyButtonClick; 

其中:

private void OnMyButtonClick(object sender, EventArgs ea) 
{ 
} 

从本质上讲,我想重复使用一个非匿名的方法来处理多个按钮的点击事件。

回答

14

Roman Nurik的回答几乎是正确的。 View.OnClickListener()实际上是一个接口。因此,如果您的活动实现了OnClickListener,则可以将其设置为按钮点击处理程序。

public class Main extends Activity implements OnClickListener { 

     public void onCreate() { 
      button.setOnClickListener(this); 
      button2.setOnClickListener(this); 
     } 

     public void onClick(View v) { 
      //Handle based on which view was clicked. 
     } 
} 

在.Net中没有委托,所以你坚持使用基于接口的函数。在.Net中,您可以通过使用委托来指定不同的功能。

+0

我没有意识到Java没有委托类型 - 感谢您清除它! – 2009-12-29 15:29:54

+1

我其实只是碰到了这篇文章(它实际上是一篇旧文章)。关于他们决定不使用代表有些有趣的评论。我不知道我是否同意,因为我喜欢在.Net中使用代表。 http://java.sun.com/docs/white/delegates.html – GrkEngineer 2009-12-29 17:02:22

1

方法的签名将需要这个......

public void onMyButtonClick(View view){ 

} 

如果你不使用动态按钮,您可以设置从设计师到“onMyButtonClick”的“点击”事件。这就是我为屏幕上的静态按钮所做的。将它与C#关联起来更容易。

+0

请注意,这是Android 1.6,IIRC的新功能。 – CommonsWare 2009-12-29 11:08:20

8

View.setOnClickListener的参数必须是类View.OnClickListenerView类的内部类)的实例。对于您的用例,您可以将此内部类的实例保存在变量中,然后将其传入,像这样:

View.OnClickListener clickListener = new OnClickListener() { 
    public void onClick(View v) { 
     // do something here 
    } 
}; 

myButton.setOnClickListener(clickListener); 
myButton2.setOnClickListener(clickListener); 

如果需要跨多个子程序/方法这个监听器,你可以将其存储在您的活动类的成员变量。

相关问题