Java 通过View.OnClickListener()传递MainActivity的对象
下面是我的应用程序MainActivity.java的示例:Java 通过View.OnClickListener()传递MainActivity的对象,java,android,parameter-passing,onclicklistener,Java,Android,Parameter Passing,Onclicklistener,下面是我的应用程序MainActivity.java的示例: /*imports and other stuffs*/ public class MainActivity extends AppCompatActivity implements View.OnClickListener { Button myButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(sa
/*imports and other stuffs*/
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
Button myButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButton = (Button) findViewById(R.id.first_button);
// myButton.setOnClickListener(this); by using it, app works as desired.
myButton.setOnClickListener(new MainActivity()); //What's wrong with this piece of codes?
}
@Override
public void onClick(View v) {
if(v.getId()==R.id.first_button){
Toast.makeText(this, "Made it", Toast.LENGTH_SHORT).show();
}
}
由于setOnClickListener()方法需要实现View.setOnClickListener的类的对象,因此可以使用自定义类implements View.setOnClickListener来处理它,但作为初学者,我的问题是,在传递MainActivity的对象时,实际发生了什么
编辑:
但是,如果我传递另一个类的对象并传递该类,那么代码就可以完美地工作,不是吗?那么这些代码呢:
public class MainActivity extends AppCompatActivity {
Button myButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButton = (Button) findViewById(R.id.first_button);
myButton.setOnClickListener(new MyClass());
}
class MyClass implements View.OnClickListener{
@Override
public void onClick(View v) {
Log.d("buttontest","Working Perfectly");
}
}
}
使用这段代码,您将在OnClickListener上为您的myButton设置。但是,您没有创建正确的侦听器对象。您正在创建类型不正确的新MainActivity对象
myButton.setOnClickListener(this);
这是正确的,因为类实现了View.OnClickListener,并且在类中实现了void-onClick(View-v)方法
如果您也喜欢,也可以这样做:
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// add code here
}
});
这将创建一个新的OnClickListener对象,并实现onClick方法。这将向setOnClickListener传递一个匿名类。如果您想让当前活动处理单击,只需传递
此
,传递活动的新实例对您没有好处,您应该让操作系统为您创建活动,不产卵yourself@OlegBogdanov这就是我正在做的,但实际上无法找出问题的原因。但是您忘记告诉我问题出在哪里了。请您澄清一下传递MainActivity类的对象(因为它实现了View.SetOnClickListener)之间的区别是什么传递这个?这个
指的是当前对象。在您的示例中,它指的是main活动
。这是因为您的MainActivity
实现了View.OnClickListener
接口。@动态观察这指的是MainActivity的当前对象和MainActivity实现的View.OnClickListener,仍然传递此类的对象,这实际上会在我的应用程序中造成问题,但是除了MainActivity以外的任何类的对象,很好用,有人能告诉我这里出了什么问题吗?@Sumon你的问题毫无意义。请发布另一个带有错误和代码示例的问题,并清楚地解释您的问题。@Sumon您正在传递实现接口的类对象。该方法知道该接口,因此可以看到View.OnClickListener而不是MainActivity。如果您的活动实现了该接口,则可以将其传递给setOnClickListener方法。
myButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// add code here
}
});