【问题标题】:How does finish() work in OnClick event?finish() 在 OnClick 事件中如何工作?
【发布时间】:2017-02-03 05:13:09
【问题描述】:

我有一个Activity,一键退出Activity

通过layout.xml 我必须将OnClick 事件设置为cmd_exit 并且调用'this.finish()' 工作正常

public void cmd_exit(View editLayout){
    this.finish();
}

,但是当我添加 OnClickListener

cmd_exit = (Button) this.findViewById(R.id.cmd_ExitApp);
cmd_exit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
    finish();
    }
});

this.finish() 给出错误。只能是finish()

我知道finish() 存在于Activity 类中,所以我的问题是它在第二个 sn-p 中是如何工作的?

【问题讨论】:

    标签: java android oop onclicklistener inner-classes


    【解决方案1】:

    当您将OnClickListener 创建为匿名类时,this 关键字指的是该侦听器实例而不是封闭类。您可以改用YourActivityClassName.this。您也可以省略this,因为OnClickListener 没有finish() 方法,所以将使用Activity

    【讨论】:

      【解决方案2】:

      在第一种情况下,this 指的是Activity 实例。在第二种情况下,您有一个 anonymous inner 类用 new View.OnClickListener() 实例化,其 this 指的是该类的实例。每个匿名内部类都有一个对其实例化的外部类的隐式引用。调用finish() 时会隐式使用该引用,即OuterClassName.this.finish()

      在第二个 sn-p 中它是如何工作的?

      编译器负责将外部类实例的引用传递给内部类。它通过添加对外部类实例的引用作为构造函数参数来修改每个内部类的构造函数。


      参考:Core Java Volume I - Fundamentals, 9th Edition,第 6.4 章:内部类,第 309 页


      正如@Gabe Sechan 指出的那样,为了在匿名内部类中引用外部类,请使用OuterClassName.this。参考:How do you get a reference to the enclosing class from an anonymous inner class in Java?

      【讨论】:

      • 对于 OP- 如果您出于某种原因确实需要使用父级的 this,请使用 MyParentClassName.this
      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      相关资源
      最近更新 更多