通过意图发送的双精度数组在接收活动中充满了空值?



我的主活动是一个测验,每个问题都包含一个betSize值和一个potSize值。测验结束后,我将发送 2 个双精度数组,betSizeArraypotSizeArray,从 MainActivity 到 ResultsActivity 以显示在列表视图中。我在第一个活动中初始化并填充数组,并使用 putExtra(( 将它们放在一个意图中。在结果活动中,我正在使用 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。

在 MainActivity 中创建 tent 并调用 startActivity(intent( 的函数中,我尝试初始化和填充 testArrayList,以确保我传递给 tent 的数组已填充并且没有充满空值。但是,在 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)
}
}

代码成功填充列表视图。但是,从数组访问的所有值都返回为"$null"。此列表视图中的每一行如下所示:

$null成$null

$null成$null

如果一切正常,我希望输出如下所示:

$50 至 $85

$15 到 $40

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

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

感谢您的任何帮助!

编辑:@Azhar92所以我刚刚在创建意图的主活动中尝试:

val bundle = Bundle()
bundle.putSerializable("BET_SIZES", betSizeArray)
bundle.putSerializable("POT_SIZES", potSizeArray)

在结果活动中:

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?>?

转换为 Array? 相反,不会引发错误,但数组仍填充 NULL。

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

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

所以你应该把它们读回Serializable值(Serializable基元类型的所有Java对象表示形式(并将它们转换为Array<Double?>?

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

另请注意,结果活动上的 betSizeArray 类型为:可序列化?,因为它可能是空的(例如,不包含在捆绑包中(,并且必须转换为所需的数组?值。

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

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

在主活动中,如下所示:

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

最新更新