【问题标题】:Passing an object of MainActivity through View.OnClickListener()通过 View.OnClickListener() 传递 MainActivity 的对象
【发布时间】:2017-05-15 15:48:43
【问题描述】:

以下是我的应用程序 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 的类的对象,因此可以使用实现 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");
    }
}

}

【问题讨论】:

  • 如果你想让你当前的活动处理点击你只需传递this,传递新的活动实例对你没有好处,你应该让操作系统为你创建活动,而不是自己产生它们
  • @OlegBogdanov 这就是我正在做的,但实际上无法弄清楚是什么导致了这里的问题。
  • 但你忘了说是什么问题

标签: java android parameter-passing onclicklistener


【解决方案1】:
myButton.setOnClickListener(new MainActivity());

使用您在 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。

【讨论】:

  • 您能否澄清一下传递 MainActivity 类的对象(因为它实现了 View.SetOnClickListener)和传递 this 有什么区别?
  • this 指的是当前对象。在您的示例中,它指的是MainActivity。这是因为你的MainActivity 实现了View.OnClickListener 接口。
  • @Orbit this 指的是 MainActivity 的当前对象和 MainActivity 实现的 View.OnClickListener,仍然传递了这个类的一个对象,实际上在我的应用程序中导致了问题,但是任何类的对象,除了 MainActivity ,都可以完美,谁能告诉我这里出了什么问题?
  • @Sumon 你的问题没有意义。请发布另一个带有错误和代码示例的问题,并清楚地解释您的问题。
  • @Sumon 您正在传递实现接口的类对象。该方法知道接口,因此它看到的是 View.OnClickListener 而不是 MainActivity。如果您的活动实现了该接口,您可以将其传递给 setOnClickListener 方法。
猜你喜欢
  • 2019-03-26
  • 2013-03-28
  • 1970-01-01
  • 2023-03-30
  • 2017-09-11
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多