setOnclickListener vs OnClickListener vs View.OnClickListener

我的理解是,当我创build一个button对象,监听点击我必须:

  1. 创buildbutton对象
  2. 使用OnClickListner让它监听用户的点击
  3. 使用onClick在用户点击button后执行操作

现在

  • setOnClickListener在哪里适合上面的逻辑?
  • 哪一个实际听button点击?
  • setOnclickListener?
  • ONclickListener?
  • View.OnClickListener?
  • 那三个之间有什么区别?

这是我在Android Dev中发现的:

 The example below shows how to register an on-click listener for a Button. // Create an anonymous implementation of OnClickListener private OnClickListener mCorkyListener = new OnClickListener() { public void onClick(View v) { // do something when the button is clicked } }; protected void onCreate(Bundle savedValues) { ... // Capture our button from layout Button button = (Button)findViewById(R.id.corky); // Register the onClick listener with the implementation above button.setOnClickListener(mCorkyListener); ... } 

将OnClickListener作为Activity的一部分来实现也可能会更方便。 这将避免额外的类加载和对象分配。 例如:

 public class ExampleActivity extends Activity implements OnClickListener { protected void onCreate(Bundle savedValues) { ... Button button = (Button)findViewById(R.id.corky); button.setOnClickListener(this); } // Implement the OnClickListener callback public void onClick(View v) { // do something when the button is clicked } } 

逻辑很简单。 setOnClickListener属于第2步。

  1. 你创buildbutton
  2. 您可以像在该示例中那样创buildOnClickListener的实例,并覆盖onClick方法。
  3. 您使用btn.setOnClickListener(myOnClickListener);将该OnClickListener分配给该buttonbtn.setOnClickListener(myOnClickListener); 在你的片段/活动onCreate -method。
  4. 当用户点击button时,分配的OnClickListeneronClick函数被调用。

*如果你import android.view.View; 你使用View.OnClickListener 。 如果你import android.view.View.*;import android.view.View.OnClickListener; 尽可能使用OnClickListener

另一种方法是让你从OnClickListenerinheritanceactivity / fragment。 通过这种方式,您可以将您的片段/活动指定为您的button的侦听器,并将onClick作为成员函数实现。

想象一下,我们有3个button

 public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Capture our button from layout Button button = (Button)findViewById(R.id.corky); Button button2 = (Button)findViewById(R.id.corky2); Button button3 = (Button)findViewById(R.id.corky3); // Register the onClick listener with the implementation above button.setOnClickListener(mCorkyListener); button2.setOnClickListener(mCorkyListener); button3.setOnClickListener(mCorkyListener); } // Create an anonymous implementation of OnClickListener private View.OnClickListener mCorkyListener = new View.OnClickListener() { public void onClick(View v) { // do something when the button is clicked // Yes we will handle click here but which button clicked??? We don't know } }; } 

那么我们会做什么?

 public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Capture our button from layout Button button = (Button)findViewById(R.id.corky); Button button2 = (Button)findViewById(R.id.corky2); Button button3 = (Button)findViewById(R.id.corky3); // Register the onClick listener with the implementation above button.setOnClickListener(mCorkyListener); button2.setOnClickListener(mCorkyListener); button3.setOnClickListener(mCorkyListener); } // Create an anonymous implementation of OnClickListener private View.OnClickListener mCorkyListener = new View.OnClickListener() { public void onClick(View v) { // do something when the button is clicked // Yes we will handle click here but which button clicked??? We don't know // So we will make switch (v.getId() /*to get clicked view id**/) { case R.id.corky: // do something when the corky is clicked break; case R.id.corky2: // do something when the corky2 is clicked break; case R.id.corky3: // do something when the corky3 is clicked break; default: break; } } }; } 

或者我们可以这样做:

 public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Capture our button from layout Button button = (Button)findViewById(R.id.corky); Button button2 = (Button)findViewById(R.id.corky2); Button button3 = (Button)findViewById(R.id.corky3); // Register the onClick listener with the implementation above button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // do something when the corky is clicked } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // do something when the corky2 is clicked } }); button3.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // do something when the corky3 is clicked } }); } } 

或者我们可以实现View.OnClickListener,我认为这是最好的方法:

 public class MainActivity extends ActionBarActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Capture our button from layout Button button = (Button)findViewById(R.id.corky); Button button2 = (Button)findViewById(R.id.corky2); Button button3 = (Button)findViewById(R.id.corky3); // Register the onClick listener with the implementation above button.setOnClickListener(this); button2.setOnClickListener(this); button3.setOnClickListener(this); } @Override public void onClick(View v) { // do something when the button is clicked // Yes we will handle click here but which button clicked??? We don't know // So we will make switch (v.getId() /*to get clicked view id**/) { case R.id.corky: // do something when the corky is clicked break; case R.id.corky2: // do something when the corky2 is clicked break; case R.id.corky3: // do something when the corky3 is clicked break; default: break; } } } 

最后这里没有真正的区别只是“比其他方式更好”

请注意,为了简单起见,我只提到了第一个代码片段,

 // Create an anonymous implementation of OnClickListener private OnClickListener mCorkyListener = new OnClickListener() { public void onClick(View v) { // do something when the button is clicked } }; protected void onCreate(Bundle savedValues) { ... // Capture our button from layout Button button = (Button)findViewById(R.id.corky); // Register the onClick listener with the implementation above button.setOnClickListener(mCorkyListener); ... } 

setOnClickListener(View.OnClickListener l)是View类的一个公共方法。 Button类扩展了View类,因此可以调用setOnClickListener(View.OnClickListener l)方法。

setOnClickListener注册一个callback,当你点击view(button)的时候被调用。 这个答案应该回答你的前两个问题:

1. setOnClickListener在哪里适合上面的逻辑?

答。 它在单击button时注册一个callback。 (在下一段详细解释)。

2.实际听哪个button点击?

答。 setOnClickListener方法是实际监听button点击的方法。

当我说它注册了一个callback被调用,我的意思是它将运行View.OnClickListener l是该方法的input参数。 在你的情况下,它将是mCorkyListener button.setOnClickListener(mCorkyListener);提到的button.setOnClickListener(mCorkyListener); 然后执行onClick(View v)提到的方法

 // Create an anonymous implementation of OnClickListener private OnClickListener mCorkyListener = new OnClickListener() { public void onClick(View v) { // do something when the button is clicked } }; 

继续前进, OnClickListener是一个接口定义,当点击一个视图(在你的案例中的button)时,将调用一个callback。 简单地说,当你点击那个button时, mCorkyListener的方法(因为它是一个OnClickListener的实现)被执行。 但是, OnClickListener只有一个方法是OnClick(View v) 。 因此,无论在点击button时需要执行什么操作,都必须在此方法中进行编码。

现在你知道setOnClickListenerOnClickListener是什么意思了,我相信你可以自己区分这两者。 第三个术语View.OnClickListener实际上是OnClickListener本身。 你有View.的唯一原因View. 之前是因为scheme开始时import情况的差异。 如果你只有import android.view.View; 作为导入语句,您将不得不使用View.OnClickListener 。 如果您提到这些导入语句之一: import android.view.View.*;import android.view.View.OnClickListener; 你可以跳过View. 并简单地使用OnClickListener

  1. 首先, View.OnClickListenerOnClickListener没有区别。 如果你直接使用View.OnClickListener ,那么你不需要写 –

    导入android.view.View.OnClickListener

  2. 通过setOnclickListener()将一个OnClickListener实例(例如myListener命名为object)设置为监听器。 当触发click事件时, myListener会得到通知,并调用onClick(View view)方法。 那就是我们自己的任务 希望这可以帮助你。

View是所有小部件的超类,OnClickListener接口属于这个类。 所有的小部件都inheritance这个。 View.OnClickListener与OnClickListener相同。 你将不得不重写这个监听器的onClick(View视图)方法来实现你想要的button操作。

要让Android监听点击窗口小部件的事件,您需要执行以下操作:

 widget.setOnClickListener(this); // If the containing class implements the interface // Or you can do the following to set it for each widget individually widget.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { // Do something here } }); 

在onClick()方法中传递的'View'参数只是让Android知道已经点击了一个视图。 它可以是一个Button或TextView或其他东西。 您可以为每个小部件设置一个OnClickListener,或者仅仅让包含所有这些小部件的类实现接口。 在这种情况下,您将为所有窗口小部件提供一个通用的onClick()方法,您只需检查传入该方法的视图的id,然后将其与每个所需元素的id进行匹配为这个元素采取行动。