【问题标题】:Static like methods in Android application with kotlin带有 kotlin 的 Android 应用程序中的静态方法
【发布时间】:2017-01-23 01:13:45
【问题描述】:

我正在尝试在 kotlin 中向 MyApplication 类添加“静态”方法 我已添加(作为属性)变量:

private var context: Context? = null

在方法中:

override fun onCreate()

我补充说:

context = applicationContext

然后我添加一个像这样的伴随对象

companion object {
    @JvmStatic fun getMyApplicationContext(): Context?
    {
        return MyApplication().context
    }
}

当我从应用程序的其他部分调用此方法时,例如 MyApplication.getMyApplicationContext() 它总是返回 null。我从多个来源收集了所有这些信息,但我不确定它是否接近正确。

【问题讨论】:

  • 使用return MyApplication().context,您正在创建一个新的 MyApplication 对象。然后您将使用.context 访问上下文,它为空,因为在您手动创建对象时不会调用onCreate()
  • context 看起来像一个实例变量,你正试图从一个你不能做的静态函数中访问一个实例变量。将上下文的声明移动到伴随对象中,使其也成为静态的。

标签: android kotlin kotlin-android-extensions


【解决方案1】:

听起来您想要一个全局应用程序上下文对象。现在抛开我对全局变量的厌恶,我认为你非常接近。

我认为您只需将变量添加到 MyApplication 类伴生对象中并直接使用它。如果要从 Java 访问该字段,则只需要 @JvmField 注释。

class MyApplication {
   companion object {
      @JvmField
      var context: Context? = null

      // Not really needed since we can access the variable directly.
      @JvmStatic fun getMyApplicationContext(): Context? {
        return context
      }
   }

   override fun onCreate() {
     ...
     MyApplication.context = appContext
   }
}

【讨论】:

  • 在 Android 中,您不会自己创建 Context 实例,它们是为您创建的。
  • @nhaarman 在这种情况下,您只需在获得Context 时设置MyApplication.context。大概这是在 MyApplication 构造函数中?
  • 实际上查看原始问题中的代码片段,似乎伴随对象的初始化发生在onCreate,所以我也将其更改为这样做。
猜你喜欢
  • 1970-01-01
  • 2017-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-18
  • 2015-03-28
  • 1970-01-01
相关资源
最近更新 更多