首页 > 解决方案 > 通过意图发送的双打数组在接收活动中充满了空值?

问题描述

我的 MainActivity 是一个测验,其中每个问题都包含一个betSize值和一个potSize值。测验结束后,我将从 MainActivity 发送 2 个 Double Arrays betSizeArraypotSizeArray到 ResultsActivity 以显示在 ListView 中。我在第一个活动中初始化并填充数组,并使用 putExtra() 将它们放入一个意图中。在 ResultsActivity 我使用 intent.extras?.getDoubleArray(key) 来检索每个数组;但是检索到的数组充满了空值。

在 ResultsActivity.OnCreate() 我第一次尝试

val betSizeArray = intent.getDoubleArrayExtra("BET_SIZES")

每当我尝试从 betSizeArray 访问值时,这都会导致 NullPointerException。

接下来我尝试了

val betSizeArray = extras?.getDoubleArray("BET_SIZES")

必须使用安全调用“ ?. ”来获取数组并访问数组的值(例如betSizeArray?.get(i))不会引发 NullPointerException;但是从数组访问的所有值都是 NULL。

已经尝试在 onCreate() 中的 MainActivity 中初始化数组,但是在 MainActivity 中使用这些数组时只会导致 NullPointerExceptions。

在我创建意图并调用 startActivity(intent) 的 MainActivity 函数中,我尝试初始化和填充 testArrayList 以确保我传递给意图的数组已填充且未充满空值。然而,在 ResultActivity 中检索到的数组仍然充满了空值。我没有在下面的代码中包含这个测试。

var betSizeArray = arrayOfNulls<Double>(20)
var potSizeArray = arrayOfNulls<Double>(20)
var count = 0

var betSize = 1.0
var potSize = 1.0


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

//here an OnKeyListener that eventually calls setNextQuestion() is created
....
}

setNextQuestion(),数组被填充的地方:

private fun setNextQuestion() {

        //check if 20 questions have been completed

        if (count < 19){

            //values are added to each array

            betSizeArray[count] = betSize
            potSizeArray[count] = potSize
            count++

            ...
            /*new values are created for betSize and potSize for next time
            this function is called*/
       }

       else endQuiz()
    }

endQuiz() 在其中创建意图并调用 startActivity()。

private fun endQuiz() {

        val resultsIntent = Intent(applicationContext, ResultsActivity::class.java)

        resultsIntent.putExtra("BET_SIZES", betSizeArray)
        resultsIntent.putExtra("POT_SIZES", potSizeArray)

        startActivity(resultsIntent)

    }

结果活动:


class ResultsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_results)


        val extras = intent.extras
        val betSizeArray = extras?.getDoubleArray("BET_SIZES")
        val potSizeArray = extras?.getDoubleArray("POT_SIZES")


        var listData = ArrayList<String>()
        var textData = ""

        //this loop is where the arrays are accessed.
        for( i in 0 .. 19){
            textData = "$" + betSizeArray?.get(i).toString() + 
            " into $" + potSizeArray?.get(i).toString()

            listData.add(textData)
        }

        val arrayAdapter = ArrayAdapter(
            this,
            android.R.layout.simple_list_item_1,
            listData
            )
        resultsListView.setAdapter(arrayAdapter)

        assessTextView.setText(assessment)
    }
}

该代码成功填充 ListView。但是,从数组访问的所有值都返回为“$null”。此 ListView 中的每一行内容如下:

$null 变成 $null

$null 变成 $null

...

如果一切正常,我希望输出看起来像:

50 美元变成 85 美元

15 美元变成 40 美元

...

其中值是在 MainActivity 中生成并通过数组和意图传递给 ResultActivity 的随机数。

我仍然怀疑我需要在 MainActivity 的 onCreate() 中初始化数组。但这只会在向 MainActivity 中的数组添加值时引发错误。

谢谢你的帮助!

编辑:@Azhar92 所以我刚刚在创建意图的 MainActivity 中尝试过:

        val bundle = Bundle()

        bundle.putSerializable("BET_SIZES", betSizeArray)
        bundle.putSerializable("POT_SIZES", potSizeArray)

在 ResultActivity 中:

        val bundle = intent.extras

        val betSizeArray = bundle?.getSerializable("BET_SIZES") as ArrayList<Double>
        val potSizeArray = bundle?.getSerializable("POT_SIZES") as ArrayList<Double>

我得到一个 TypeCastException:

     Caused by: kotlin.TypeCastException: null cannot be cast to non-null type kotlin.collections.ArrayList<kotlin.Double> /* = java.util.ArrayList<kotlin.Double> */
        at com.example.questgen.ResultsActivity.onCreate(ResultsActivity.kt:39)

第 39 行是第一个 getSerializable()。因此,出于某种原因,通过意图的数组似乎仍然为空。

        val betSizeArray = bundle?.getSerializable("BET_SIZES") as Array<Double?>?

投射到数组?而是不会抛出错误,但数组仍然充满了 NULL。

最终编辑:它的工作!我将所有变量移到类标题下。将数组初始化从 arrayOfNulls 更改为 DoubleArray(20)。取出了很多私有方法参数,因为我现在有了有意义且可访问的类变量。从 bundle.putSerializable() 切换到 intent.putExtra()。在 ResultsActivity 中,我从 bundle.getSerializable() 切换到了 intent.getDoubleArrayExtra()。我认为有一些方法可以使 Serializable 和 bundles 工作,但这是我第一次得到结果。我认为您对我之前在某处重新声明变量是正确的。谢谢gmetal!

标签: androidandroid-intentkotlin

解决方案


将返回一个可能不包含空值getDoubleArrayExtra的 Java 。由于您使用该方法double[]初始化它们,因此将返回 an 。当你从额外的意图中检索它时,你将需要一个, 因为可能会返回一个空值。arrayOfNullsArray<Double?>Array<Double?>?

因此,您应该将它们作为值读回Serializable(原始类型的所有 Java 对象表示形式都是Serializable)并将它们转换为Array<Double?>?

    val extras = intent.extras
    val betSizeArray = extras?.getSerializable("BET_SIZES") as Array<Double?>?
    val potSizeArray = extras?.getSerializable("POT_SIZES") as Array<Double?>?

另请注意,ResultsActivity 上的 betSizeArray 的类型将为:Serializable?,因为它可能为 null(例如,未包含在包中),并且必须强制转换为所需的 Array?价值。

如果这不起作用,这意味着您在 MainActivity 中没有做正确的事情。我将首先移动这些变量声明:

var betSizeArray = arrayOfNulls<Double>(20)
var potSizeArray = arrayOfNulls<Double>(20)
var count = 0

var betSize = 1.0
var potSize = 1.0

在 MainActivity 里面是这样的:

class MainActivity : AppCompatActivity() {
    var betSizeArray = arrayOfNulls<Double>(20)
    var potSizeArray = arrayOfNulls<Double>(20)
    var count = 0

    var betSize = 1.0
    var potSize = 1.0

推荐阅读