Kotlin&Databinding Int值空值检查问题

时间:2018-08-10 07:41:57

标签: java android kotlin android-databinding

这是我遇到过的最奇怪的问题。

再次,kotlin和数据绑定使我陷入困境。我从代码开始提问。

模型类

data class ModelBottomItem(
        @StringRes val name: Int,
        @DrawableRes val image: Int,
        val gender: Int = 0,
        val enabled: Boolean = true,
        val disabledIconColor: Int = 0)
    : BaseModel()

布局代码

<variable
    name="item"
    type="myModel"/>


<TextView
    android:text="@{item.gender == 0 ? @string/male : @string/female}"
    ...
    />

调试跟踪列表

0 = {ModelBottomItem@6406} "ModelBottomItem(name=2131755043, image=2131230862, gender=0, enabled=true, disabledIconColor=0)"
08-10 12:57:12.388 24902-24902/acr.browser.barebones E/AndroidRuntime: FATAL EXCEPTION: main
    Process: acr.browser.barebones, PID: 24902
    java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Integer.intValue()' on a null object reference
     

等等,等等!

如果我更改了item.gender == null

然后该代码无法构建。它失败并显示以下错误。

error: incomparable types: int and <null>
                itemGenderJavaLangObjectNull = (itemGender) == (null);

分两行理解问题。

  • 当我检查 item.gender == null 时显示错误incomparable types: int and <null>
  • 并且当我检查 item.gender == 0 时,如果运行时为0,代码将崩溃并显示 int java.lang.Integer.intValue()' on a null object reference 。即使您可以看到调试跟踪,我的模型项也为0,而不是**null**。即使我已经将默认值设置为性别,即 val gender: Int = 0 那么它怎么可以为null或0?

3 个答案:

答案 0 :(得分:1)

在这种情况下,请像这样使用 toIntOrNull()

 item.gender.toString().toIntOrNull()

示例

    val numb=""
    val numb2="7"
    val print1=numb.toIntOrNull()
    println(print1) //out put is null
    val print2=numb2.toIntOrNull()
    println(print2) // output is 7

您的数据模型使用可为null的Int吗?

 gender: Int? = 0 as parameter

像这样

 data class ModelBottomItem(
    @StringRes val name: Int,
    @DrawableRes val image: Int,
    val gender: Int?= 0,
    val enabled: Boolean = true,
    val disabledIconColor: Int = 0)
: BaseModel()

答案 1 :(得分:0)

看起来您没有在Activity中正确调用yourActivityBinding.setItem(your_item)。

尝试在活动中添加一个断点,以确认您没有将空项目绑定到布局上

答案 2 :(得分:0)

这也可行:

android:someBinding="@{(Integer) null}"