我的理解是,当我创建一个侦听点击的按钮对象时,我必须:
OnClickListner
使其听取用户点击onClick
在用户点击按钮后执行操作现在,
setOnClickListener
在哪里符合上述逻辑? 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
}
}
答案 0 :(得分:53)
想象一下,我们有3个按钮,例如
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;
}
}
}
最后这里没有真正的区别只是“比其他方式更好”
答案 1 :(得分:21)
逻辑很简单。 setOnClickListener
属于第2步。
OnClickListener
*的实例,就像在该示例中完成的那样,并覆盖onClick
- 方法。OnClickListener
- 方法中使用btn.setOnClickListener(myOnClickListener);
将onCreate
分配给该按钮。onClick
的{{1}}功能。 *如果您OnClickListener
使用import android.view.View;
。如果您View.OnClickListener
或import android.view.View.*;
,我就会使用import android.view.View.OnClickListener;
。
另一种方法是让您从OnClickListener
继承活动/片段。这样,您可以将片段/活动指定为按钮的侦听器,并将OnClickListener
实现为成员函数。
答案 2 :(得分:7)
请注意,为简单起见,我只提到了第一个代码片段,即
// 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注册一个回调,当单击视图(在您的情况下为按钮)时将调用该回调。这个答案应该回答你的前两个问题:
<强> 1。 setOnClickListener
在哪里符合上述逻辑?
答。它在单击按钮时注册回调。 (在下一段中详细解释)。
<强> 2。哪一个实际上听了按钮点击?
答。 setOnClickListener
方法是实际侦听按钮单击的方法。
当我说它注册一个要调用的回调时,我的意思是它将运行View.OnClickListener l
作为该方法的输入参数。在您的情况下,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
是一个接口定义,用于在单击视图(在您的情况下为按钮)时调用的回调。简单地说,当您单击该按钮时,mCorkyListener
内的方法(因为它是OnClickListener
的实现)将被执行。但是,OnClickListener
只有一种OnClick(View v)
方法。因此,无论在单击按钮时需要执行的操作都必须在此方法中进行编码。
既然您知道setOnClickListener
和OnClickListener
的含义,我相信您自己能够区分这两者。第三项View.OnClickListener
实际上是OnClickListener
本身。你前面有View.
的唯一原因是因为程序开头的import
语句不同。如果您只有import android.view.View;
作为导入语句,则必须使用View.OnClickListener
。如果您提到以下任何一个import语句:
import android.view.View.*;
或import android.view.View.OnClickListener;
您可以跳过View.
,只需使用OnClickListener
。
答案 3 :(得分:4)
View是所有窗口小部件的超类,OnClickListener接口属于此类。所有小部件都继承了这个。 View.OnClickListener与OnClickListener相同。您必须从此侦听器覆盖onClick(视图视图)方法,才能实现按钮所需的操作。
要告诉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相匹配。对该元素采取行动。
答案 4 :(得分:3)
首先,View.OnClickListener
和OnClickListener
之间没有区别。如果您直接使用View.OnClickListener
,则无需编写 -
import android.view.View.OnClickListener
通过myListener
将OnClickListener实例(例如setOnclickListener()
命名对象)设置为视图的侦听器。触发click
事件时,会通知myListener
并调用onClick(View view)
方法。这就是我们自己完成任务的地方。
希望这会对你有所帮助。