Java 通过View.OnClickListener()传递MainActivity的对象

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

下面是我的应用程序MainActivity.java的示例:

/*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
            }
        });