Android kotlin和正确声明变量
我最近从java搬到了kotlin。我在管理变量时遇到了一些问题。例如,在Java中,我可以很容易地在类的开头声明一个变量Android kotlin和正确声明变量,android,kotlin,Android,Kotlin,我最近从java搬到了kotlin。我在管理变量时遇到了一些问题。例如,在Java中,我可以很容易地在类的开头声明一个变量 private Window window 然后,在设置视图时,我可以使用 window = activity.getWindow(); // clear FLAG_TRANSLUCENT_STATUS flag: window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); // add
private Window window
然后,在设置视图时,我可以使用
window = activity.getWindow();
// clear FLAG_TRANSLUCENT_STATUS flag:
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
// add FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS flag to the window
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
// finally change the color
window.setStatusBarColor(ContextCompat.getColor(activity,R.color.my_statusbar_color));
最后,如果我想或者需要,我可以在类中的任何时候通过调用
window.setStatusBarColor
在科特林,同样的方法不起作用。无论我以何种方式在顶部声明变量
private var window: Window? = activity?.window
private lateinit var window: Window
private war window: Window? = null
无论我如何声明它,当我尝试在以后的类中设置一个方法中的状态栏颜色时,窗口总是空的
有人能解释一下为什么会发生这种情况,以及如何实现我在Java中拥有的类似功能吗。在Java代码中,有两行关联:字段的声明(
private Window;
)和给该字段赋值(Window=activity.getWindow();
)
在Kotlin代码变体中:
- 第一个(
)在同一语句中具有声明和赋值。如果private-var-window:window?=activity?.window
不是activity
并且null
activity?,这是可以的。窗口
不是
。在你的情况下,很明显,这可能是由于一些Android的时间问题null
- 第二个(
)没有赋值,也没有证据表明您以后给它赋值private lateinit var window:window
- 第三个,在输入错误更正后(
)有一个赋值,但值是private-var-window:window?=null
。没有证据表明您稍后为其分配了非null值null
window=活动?.window
据推测,您的Java代码在正确的时间点上有它。添加到
您可以使用您提到的其中一种方法
private lateinit var window: Window
private var window: Window? = null
然后在onActivityCreated(Bundle?中,您可以这样分配值(在onActivityCreated中,活动从不为空):
另一种方法是,惰性地分配值,如下所示:
private val window: Window by lazy {
requireActivity().window
}
注意:无论采用哪种方式,请确保您在创建(捆绑?)的活动上/之后使用
窗口变量。我在一个片段中,我正在从onActivityCreated()
回调调用window
上的各种方法。为什么你推荐第三种方法而不是lateinit var
?@GavinWright:我对使用此代码的上下文知之甚少,getWindow()
不能返回null
。因此,在这种情况下,我不愿意推荐lateinitvar
lateinit var
在您确实确定在使用它之前将其初始化为非空值的情况下是可以的。
private val window: Window by lazy {
requireActivity().window
}