【问题标题】:What's the difference between passing this vs. ClassName.this from an event handler when passed to Intent constructor?当传递给 Intent 构造函数时,从事件处理程序传递 this 与 ClassName.this 有什么区别?
【发布时间】:2012-09-26 03:41:16
【问题描述】:

在早期的 Android 编程教程第 192 页中,我们看到了 LunchList#onOptionsItemSelected 的实现。在这个实现中,我们看到两个Intents 被传递给startActivity:一个的构造函数被传递给LunchList.this,另一个的构造函数被传递给this

有什么区别?

See lines 78 - 91 here。注意onOptionsItemSelected 是如何没有在内部类中声明的。

在 Android/Java 中,this 的值是否会在事件处理程序或通过反射的函数绑定的上下文中发生变化?两个Intent 实例都可以通过this 吗?

【问题讨论】:

    标签: java android event-handling commonsware


    【解决方案1】:

    在 Java 中,this 指的是包含类,ClassName.this 指的是名称为 ClassName 的第一个包含类。事件处理程序通常写成匿名的内部类,所以如果你想引用事件处理程序的包含类(而不是事件处理程序的类),你需要指定ContainingClass.this,而不是this

    参考:http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.8.4

    【讨论】:

    • 我已经添加了指向相关来源的链接。请注意,onOptionsItemSelected 未在内部类中声明。
    • 在这种情况下,类名是多余的/冗余的。
    【解决方案2】:

    当您在Inner Class 中创建Intent 时,请使用ClassName.this(此处className 必须是Activity 类名称),如果在Activity 类中创建Intent,您可以使用this

    【讨论】:

    • 我已经添加了指向相关来源的链接。请注意,onOptionsItemSelected 未在内部类中声明
    • 您也可以使用this 代替LunchList.this
    • 意思,这种情况没有区别?
    • 是的,因为您正在顶级类中创建Intent
    • 为什么要这样写?可能代码位于需要 ClassName.this 的内部类中,后来被重构为顶级类本身。
    【解决方案3】:

    对于这个例子,它不会有任何区别,因为在任何一种情况下,将启动活动的类都将保持不变。 Intent 的第一个参数是指启动 Activity 和传递捆绑数据的类的上下文。

    【讨论】:

      猜你喜欢
      • 2012-02-19
      • 2016-06-23
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 2012-08-30
      • 1970-01-01
      相关资源
      最近更新 更多