2012-01-14 19 views
1

我不明白为什么我必须实现OnClickListener才能使用OnClick方法。假设这个代码:通过活动实现OnClickListener的效果如何?

public class KlickitestActivity extends Activity implements OnClickListener { 
/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
} 

@Override 
public void onClick(View v) { 
    // code what happens when a click is made 
} 

从类OnClickListener我只使用方法onClick(视图v) - 这一个被覆盖。为什么我不能在不实现OnClickListener的情况下定义onClick方法?

回答

5

您可以。你可以通过使用匿名内部类:

Button1.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //Do stuff 
     }}); 
Button2.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      //Do stuff 
     }}); 

然而实现一个OnClickListener可以更容易地处理事件,并提高了代码的可读性。即你可以使用一个监听器方法,并传递一个View来处理多个按钮/与switch语句听众,类似的东西:

public void onClick(View view){ 
    switch(view.getId()){ 

    case R.id.Button1: 
     //Stuff for button 1 
     break; 

    case R.id.Button2: 
     //Stuff for button 2 
     break; 
     break; 

    case R.id.Button3: 
     //Stuff for button 3 
     break; 
    } 
+0

谢谢,暴民,这对我来说是一个非常可以理解的答案!但是我仍然不明白当我实现OnClickListener时会发生什么。我的意思是它没有实例化一个OnClickListener的新对象,只是通过实现? (希望我的语言是可以理解的:-) – BNetz 2012-01-15 00:15:10

+1

实现OnCLickListener有效地使您的Activity类都是一个Activity和一个OnCLickListener,这意味着您可以将Activity的实例传递给以OnClickListener作为参数的对象。 http://docs.oracle.com/javase/tutorial/java/concepts/interface.html – 2012-01-15 00:37:36

+0

谢谢,斯科特的解释! – BNetz 2012-01-15 13:49:45

1

只是对挑战者的回答扩大,也斯科特的评论和链接...

Activity主要是UI的框架,因此没有与用户交互的预定义方式。作为设计者/开发者,我们根据Activity的目的选择我们想要的Activity包含哪些UI组件。

的UI组件,例如ButtonsCheckBoxesListViews等,服务非常不同的目的,它不是在它的Activity的地方的基本形式,以了解事件的UI元素(点击,长点击反应,滑动等),因为没有预定义的UI元素集合,Activity将始终托管。因此,我们有责任根据我们如何设计UI来实现我们需要使用的事件处理程序(侦听器)。