Android - setOnClickListener 对比 OnClickListener 对比 View.OnClickListener
Android - setOnClickListener vs OnClickListener vs View.OnClickListener
我的理解是,当我创建一个监听点击的按钮对象时,我必须:
- 创建按钮对象
- 使用
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
的一部分来实施会更方便。这将避免额外的 class 负载和对象分配。例如:
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 步。
- 您创建按钮
- 您创建了一个
OnClickListener
* 的实例,就像在该示例中所做的那样,并覆盖了 onClick
方法。
- 您在 fragments/activities
onCreate
方法中使用 btn.setOnClickListener(myOnClickListener);
将 OnClickListener
分配给该按钮。
- 当用户点击按钮时,调用分配的
OnClickListener
的 onClick
函数。
*如果你 import android.view.View;
你使用 View.OnClickListener
。如果你 import android.view.View.*;
或 import android.view.View.OnClickListener;
你使用 OnClickListener
据我所知。
另一种方法是让你activity/fragment继承自OnClickListener
。通过这种方式,您可以将 fragment/activity 指定为按钮的侦听器,并将 onClick
实现为成员函数。
首先,View.OnClickListener
和OnClickListener
没有区别。如果直接用View.OnClickListener
就不用写-
导入android.view.View.OnClickListener
您通过 setOnclickListener()
将一个 OnClickListener 实例(例如 myListener
命名对象)设置为视图的侦听器。当触发 click
事件时,会通知 myListener
并调用它的 onClick(View view)
方法。那是我们完成自己任务的地方。
希望对你有帮助。
假设我们有 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;
}
}
}
终于在这里没有真正的区别只是"Way better than the other"
View 是所有小部件的超级class,OnClickListener 接口属于这个class。所有小部件都继承了这一点。 View.OnClickListener 与 OnClickListener 相同。您必须覆盖此侦听器的 onClick(View view) 方法才能实现您希望按钮执行的操作。
要告诉 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 或简单地使包含所有这些小部件的 class 实现接口。在这种情况下,您将为所有小部件使用一个通用的 onClick() 方法,您所要做的就是检查传递给该方法的视图的 ID,然后将其与您想要的每个元素的 ID 进行匹配,对该元素采取行动。
请注意,为了简单起见,我仅引用了第一个代码片段,即
// 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)
是视图 class 的一个 public 方法。按钮 class 扩展视图 class,因此可以调用 setOnClickListener(View.OnClickListener l)
方法。
setOnClickListener 注册一个回调,当点击视图(在你的例子中是按钮)时调用。这个答案应该回答你的前两个问题:
1. setOnClickListener
符合上述逻辑的什么地方?
回答。单击按钮时它会注册一个回调。 (在下一段详细解释)。
2。哪个真正听到按钮点击?
回答。 setOnClickListener
方法是实际监听按钮点击的方法。
当我说它注册一个回调函数时,我的意思是它将 运行 View.OnClickListener l
作为该方法的输入参数。在您的情况下,它将是 button.setOnClickListener(mCorkyListener);
中提到的 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 android.view.View.*;
或 import android.view.View.OnClickListener;
你可以跳过 View.
并简单地使用 OnClickListener
.
我的理解是,当我创建一个监听点击的按钮对象时,我必须:
- 创建按钮对象
- 使用
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
的一部分来实施会更方便。这将避免额外的 class 负载和对象分配。例如:
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 步。
- 您创建按钮
- 您创建了一个
OnClickListener
* 的实例,就像在该示例中所做的那样,并覆盖了onClick
方法。 - 您在 fragments/activities
onCreate
方法中使用btn.setOnClickListener(myOnClickListener);
将OnClickListener
分配给该按钮。 - 当用户点击按钮时,调用分配的
OnClickListener
的onClick
函数。
*如果你 import android.view.View;
你使用 View.OnClickListener
。如果你 import android.view.View.*;
或 import android.view.View.OnClickListener;
你使用 OnClickListener
据我所知。
另一种方法是让你activity/fragment继承自OnClickListener
。通过这种方式,您可以将 fragment/activity 指定为按钮的侦听器,并将 onClick
实现为成员函数。
首先,
View.OnClickListener
和OnClickListener
没有区别。如果直接用View.OnClickListener
就不用写-导入android.view.View.OnClickListener
您通过
setOnclickListener()
将一个 OnClickListener 实例(例如myListener
命名对象)设置为视图的侦听器。当触发click
事件时,会通知myListener
并调用它的onClick(View view)
方法。那是我们完成自己任务的地方。 希望对你有帮助。
假设我们有 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;
}
}
}
终于在这里没有真正的区别只是"Way better than the other"
View 是所有小部件的超级class,OnClickListener 接口属于这个class。所有小部件都继承了这一点。 View.OnClickListener 与 OnClickListener 相同。您必须覆盖此侦听器的 onClick(View view) 方法才能实现您希望按钮执行的操作。
要告诉 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 或简单地使包含所有这些小部件的 class 实现接口。在这种情况下,您将为所有小部件使用一个通用的 onClick() 方法,您所要做的就是检查传递给该方法的视图的 ID,然后将其与您想要的每个元素的 ID 进行匹配,对该元素采取行动。
请注意,为了简单起见,我仅引用了第一个代码片段,即
// 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)
是视图 class 的一个 public 方法。按钮 class 扩展视图 class,因此可以调用 setOnClickListener(View.OnClickListener l)
方法。
setOnClickListener 注册一个回调,当点击视图(在你的例子中是按钮)时调用。这个答案应该回答你的前两个问题:
1. setOnClickListener
符合上述逻辑的什么地方?
回答。单击按钮时它会注册一个回调。 (在下一段详细解释)。
2。哪个真正听到按钮点击?
回答。 setOnClickListener
方法是实际监听按钮点击的方法。
当我说它注册一个回调函数时,我的意思是它将 运行 View.OnClickListener l
作为该方法的输入参数。在您的情况下,它将是 button.setOnClickListener(mCorkyListener);
中提到的 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 android.view.View.*;
或 import android.view.View.OnClickListener;
你可以跳过 View.
并简单地使用 OnClickListener
.