android - 通过意图发送的双打数组在接收活动中充满了空值?
问题描述
我的 MainActivity 是一个测验,其中每个问题都包含一个betSize值和一个potSize值。测验结束后,我将从 MainActivity 发送 2 个 Double Arrays betSizeArray和potSizeArray到 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!
解决方案
将返回一个可能不包含空值getDoubleArrayExtra
的 Java 。由于您使用该方法double[]
初始化它们,因此将返回 an 。当你从额外的意图中检索它时,你将需要一个, 因为可能会返回一个空值。arrayOfNulls
Array<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
推荐阅读
- laravel - 为什么在组件重置之前我的组件的输入事件不会触发?
- python - 问:如何使用 mplfinance 在烛台图上绘制支撑线和阻力线?
- java - inflater.inflate(R.layout.) 没有找到 Fragment.xml
- python - 模块在语法错误的名称空间下导入?
- ios - 快速获取viewController.view的呈现viewController
- javascript - 如何从烧瓶服务器中的blob接收wav文件?
- karate - 空手道。比较两个期望 XML 响应但 1 是 xml 而另一个是 Json 的 Webmethod 响应
- r - 获取在 R 中用成像器加载的图片点的坐标
- parsing - 有没有办法强制 JavaCC 接受模棱两可的非 LL(1) 语法?
- rust - 为什么在 BTreeSet 和 HashSet 之间切换时,Bron-Kerbosch 算法会得到不同的结果?