【问题标题】:Get problem while calling a method of a class from fragment从片段调用类的方法时出现问题
【发布时间】:2020-09-27 11:44:13
【问题描述】:

我在这里有 2 节课:

#1 报警接收器

class AlarmReceiver: BroadcastReceiver() {
...
fun setRepeatingAlarm(context: Context) {} //the method that i want to call
}

#2 SettingFragment(附加到 SettingActivity)

SettingFragment(): PreferencefragmentCompat() {
private lateinit var reminder: String
private lateinit var language: String

private lateinit var alarmReceiver: AlarmReceiver

private lateinit var langPreference: Preference
private lateinit var reminderPreference: SwitchPreference
override fun onCreatePreferences(savedInstanceState: Bundle?, s: String?) {
    addPreferencesFromResource(R.xml.settings)
    init()

}
private fun init() {
    reminder = resources.getString(R.string.key_reminder)
    language = resources.getString(R.string.key_language)
    alarmReceiver = AlarmReceiver()


    langPreference = findPreference<Preference> (language) as Preference
    reminderPreference = findPreference<SwitchPreference> (reminder) as SwitchPreference
}
private fun reminderSetting() {
    // the method where i place the that method
}

我对如何从我调用的方法定义上下文参数感到困惑。 我尝试编写此代码:

alarmReceiver.setRepeatingAlarm(activity.applicationContext)

但我收到错误“FragmentActivity 类型的可空接收器只允许安全 (?.) 或非空断言 (!!.) 调用?” 如何解决这个问题呢?谢谢你:)

【问题讨论】:

  • activity 根据类型定义可以是null。如果你确定这里不可能是null,写alarmReceiver.setRepeatingAlarm(activity!!.applicationContext)

标签: android-studio kotlin android-fragmentactivity


【解决方案1】:

activity 属性实际上调用了FragmentgetActivity() 方法,该方法可以返回 null - 片段可能处于创建它的状态,但实际上并未附加到 @ 987654325@,所以在这种情况下,这个方法将返回null

您将另一个调用链接到结果上,因此因为它可能为空,所以您要么调用Activity.applicationContext(好!)要么调用null.applicationContext(非常糟糕!)。所以警告告诉你你正在这样做,你要么需要安全地处理那个潜在的空值(使用?. 调用),要么明确地说“当我调用它时这绝对不会为空”(使用!!.打电话)

您应该阅读Kotlin's null safety handling,因为它很重要,而且它最终会让您的生活变得更轻松。但是在这种情况下(和大多数情况下)你不应该使用!!,因为在某些情况下它不会为真,属性将为空,然后你的应用程序崩溃

这是处理它的安全方法:

activity?.let { alarmReceiver.setRepeatingAlarm(it.applicationContext) }

有很多方法可以编写,但这是最容易理解的 - 如果activity 不为空,它运行let 块,将非空activity 作为变量传递it。然后你可以以同样的方式运行你的代码,因为现在你知道它不是空的!如果activity null,则let 块根本不会运行。您的闹钟不会设置,但如果您的应用程序崩溃也不会设置 - 这样您就可以处理它,或者如果这是一种不应该发生的罕见情况,您可以什么都不做 - 它是至少绝对不会因为NullPointerException 而崩溃!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2013-01-16
    • 1970-01-01
    相关资源
    最近更新 更多