Android kotlin和正确声明变量

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

我最近从java搬到了kotlin。我在管理变量时遇到了一些问题。例如,在Java中,我可以很容易地在类的开头声明一个变量

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?,这是可以的。窗口
    不是
    null
    。在你的情况下,很明显,这可能是由于一些Android的时间问题

  • 第二个(
    private lateinit var window:window
    )没有赋值,也没有证据表明您以后给它赋值

  • 第三个,在输入错误更正后(
    private-var-window:window?=null
    )有一个赋值,但值是
    null
    。没有证据表明您稍后为其分配了非
    null

我建议您使用第三种方法,但是在Kotlin代码中,将相同的赋值放在Java代码中的相同位置:

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
}