我是 android 新手,第一次学习。
我正在制作一个非常简单的 fragment ,例如当用户单击按钮时,应用程序应该显示一条 Toast 消息。
我在网上阅读了很多教程。我在网上看到的所有教程都使用 anonymous inner class
实现listeners
以及他们的方法。
我尝试过的在这里:
public class MainActivity extends Activity {
private Button mTrue;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTrue= (Button) findViewById(R.id.turebutton);
mTrue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, R.string.correct_toast,Toast.LENGTH_LONG).show();
}
});
}
它工作得很好,但似乎很难理解。
我熟悉 Java 基础知识。我已阅读this我已经知道 inner class
和anonymous inner class
在java
。
在 java
,如果我们编写类似此示例的代码,
public void init(){
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent me){
showStatus("mouse pressed");
}
});
}
MouseListener
是一个接口(interface),然后我们创建 MouseAdapter
的实例并将其传递给调用 Listener
的方法。
我有一些问题:
为什么我们在这里传递了接口(interface)(
View.onClickListener
)的实例?..我已经检查了文档,View.onClickListener
是接口(interface)而不是类。setonClickListener
看起来和addMouseListener
一样。但矛盾的是在java中,我们必须add
听众和pass
类的实例。这里事情是相反的。
我完全连线了。如果有人能解释清楚,请帮忙。提前致谢。
最佳答案
mTrue.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, R.string.correct_toast,Toast.LENGTH_LONG).show();
}
});
此处您将传递一个实现 View.OnClickListener()
接口(interface)的匿名类的实例。
View
类的 setOnClickListener
方法接受 View.OnClickListener
类型的参数。因此,提供一个实现此接口(interface)的实例是可行的。
至于addMouseListener
,假设您指的是this method Component
的,它也接受一个接口(interface) - MouseListener
。
但是,在您的示例中:
public void init(){
addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent me){
showStatus("mouse pressed");
}
});
}
您正在向其传递一个继承自 MouseAdapter
的匿名类的实例,该类本身实现了 MouseListener
接口(interface)。
因此,这两个示例非常相似。
关于java - 使用匿名内部类 - 添加监听器和传递实例时发生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25407657/