Android 此.getPreferences()上的NullPointerException
我试图通过调用Android 此.getPreferences()上的NullPointerException,android,kotlin,nullpointerexception,Android,Kotlin,Nullpointerexception,我试图通过调用this.getPreferences()来创建对我的活动的默认共享首选项文件的引用 结果给了我一个NullPointerException-为什么?它与UI没有关联,因此不需要在setContentView()之后调用它。为什么此时活动将为null?最安全的调用位置是在super.onCreate(savedInstnaceState)之后 调用此命令最安全的地方是在super.onCreate(savedInstnaceState)之后 将行在super.onCreate之后的
this.getPreferences()
来创建对我的活动的默认共享首选项文件的引用
结果给了我一个
NullPointerException
-为什么?它与UI没有关联,因此不需要在setContentView()之后调用它。为什么此时活动将为null
?最安全的调用位置是在super.onCreate(savedInstnaceState)
之后 调用此命令最安全的地方是在super.onCreate(savedInstnaceState)
之后 将行在super.onCreate之后的onCreate内移动
class PlayerDetails : AppCompatActivity(), View.OnClickListener, TextWatcher {
val sharedPref = this.getPreferences(Context.MODE_PRIVATE) // NPE
var applicationID = sharedPref.getString("applicationID", null)
private lateinit var binding: ActivityPlayerDetailsBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_player_details)
...
}
...
在super.onCreate之后将行移到onCreate内部
class PlayerDetails : AppCompatActivity(), View.OnClickListener, TextWatcher {
val sharedPref = this.getPreferences(Context.MODE_PRIVATE) // NPE
var applicationID = sharedPref.getString("applicationID", null)
private lateinit var binding: ActivityPlayerDetailsBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_player_details)
...
}
...
通过执行此操作,您从AppCompatActivity调用了inherit方法。getPreferences(Context.MODE\u PRIVATE),因为onCreate是启动活动时的第一个回调,所以还没有进行设置。通过执行此操作,您从AppCompatActivity调用了inherit方法,由于onCreate是启动活动时的第一个回调,所以还没有设置
它与UI没有关联,因此不需要在之后调用它
setContentView()
是的,但必须在以下时间后调用:
val PREFS_NAME = "com.teamtreehouse.colorsarefun.prefs"
var prefs: SharedPreferences? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
prefs = = this.getSharedPreferences(PREFS_FILENAME, 0)
binding = DataBindingUtil.setContentView(this, R.layout.activity_player_details)
...
}
因为此
引用活动的上下文
,并且此上下文
仅在调用后有效。
因此,您可以将声明更改为:
super.onCreate(savedInstanceState)
这样,在调用super.onCreate(savedInstanceState)
后,第一次使用它时将初始化SharedRef
阅读更多关于
它与UI没有关联,因此不需要在之后调用它
setContentView()
是的,但必须在以下时间后调用:
val PREFS_NAME = "com.teamtreehouse.colorsarefun.prefs"
var prefs: SharedPreferences? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
prefs = = this.getSharedPreferences(PREFS_FILENAME, 0)
binding = DataBindingUtil.setContentView(this, R.layout.activity_player_details)
...
}
因为此
引用活动的上下文
,并且此上下文
仅在调用后有效。
因此,您可以将声明更改为:
super.onCreate(savedInstanceState)
这样,在调用super.onCreate(savedInstanceState)
后,第一次使用它时将初始化SharedRef
了解更多信息。我不想将其移动到onCreate中,因为我希望它可以被我的系统中的其他函数访问activity@Zorgan将prefs作为类变量,然后在onCreate()@Zorgan中使用这个.getSharedReferences(),请参考更新的代码。您可以在活动中的任何位置引用“prefs”。我不希望在创建时将其移到内部,因为我希望它可以被活动中的其他函数访问activity@Zorgan将prefs作为类变量,然后在onCreate()@Zorgan中使用这个.getSharedReferences(),请参考更新的代码。您可以在活动中的任何地方引用“prefs”谢谢。但是,如果我想在onCreate()
之前引用sharedPref
val,该怎么办?(如果您想查看,我已经更新了代码)。因为我希望applicationID
成为整个类的公共变量。只有在初始化SharedRef`之后才能初始化applicationID`。谢谢。但是,如果我想在onCreate()
之前引用sharedPref
val,该怎么办?(如果您想查看,我已经更新了代码)。因为我希望applicationID
成为整个类的公共变量。只有在初始化SharedRef`之后才能初始化applicationID`。