当前位置: 首页 > 知识库问答 >
问题:

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

雷浩思
2023-03-14

我的主活动是一个测验,每个问题都包括一个betSize值和一个potSize值。测验结束后,我将发送2个双数组,betSizeArray和potSizeArray,从主活动到结果活动,以显示在列表视图中。我在第一个活动中初始化和填充数组,并使用putExtra()将它们放入意图中。在结果活动中,我使用intent.extras?.getDoubleArray(键)检索每个数组;但是检索到的数组充满了空值。

在结果活动中。OnCreate()我第一次尝试

val betSizeArray=意图。getDoubleArrayExtra(“BET_大小”)。

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

接下来我试着

val betSizeArray=额外费用?。getDoubleArray(“BET_大小”)。

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

我尝试在onCreate()内初始化MainActivity中的数组,但是,每当在MainActivity中使用这些数组时,这只会导致NullPointerException。

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

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()
    }

Endquick(),其中创建意图并调用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”。此列表视图中的每一行内容如下:

$null变成$null

$null变成$null

...

如果一切正常,我预期的输出将如下所示:

50美元到85美元

15美元到40美元

...

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

我仍然怀疑需要初始化MainActivity的onCreate()中的数组。但只要在MainActivity中向数组添加值,就会出现错误。

谢谢你的帮助!

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

        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()。因此,出于某种原因,似乎正在通过intent的数组仍然为null。

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

向阵列施放?相反,不会抛出错误,但数组仍填充NULL。

最终编辑:它正在工作!我将所有变量移到类标题下。将阵列初始化从arrayOfNulls更改为DoubleArray(20)。去掉了很多私有方法参数,因为我现在有了有意义且可访问的类变量。从束切换。putSerializable()到intent。putExtra()。在ResultsActivity中,我从bundle切换了。getSerializable()到intent。getDoubleArrayExtra()。我假设有某种方法可以使序列化和捆绑包工作,但这是我第一次得到结果的原因。我想你说得对,我以前在什么地方重新声明了变量。谢谢你,gmetal!

共有1个答案

孙承
2023-03-14

getDoubleArrayExtra将返回一个可能不包含空值的Java双[]。由于您使用arrayOfNulls方法初始化它们,因此

因此,您应该将它们读回为可序列化的值(原语类型的所有Java对象表示都是可序列化的),并将它们转换为数组

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

还要注意,ResultActivity上的betSizeArray类型将为:Serializable?,因为它可能为null(例如,不包含在捆绑包中),并且必须强制转换为所需的数组?价值

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

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
 类似资料:
  • 问题内容: 我正在通过一个Intent传递一个int,但是我不知道如何接收它,因为我必须从OnCreate方法中接收一个intent,但是如果我将其放置在那里,则无法将其与其余代码中的另一个int进行比较:我在这里发送意图: 在这里,我收到它: 但是在onCreate方法之后,我必须这样做: 问题答案: 您需要获取在方法中传递的数据,而不是在声明中。 另外你不发送,正在发送中。所以,你需要得到从。

  • 我有一个数组类型的。我必须在python中通过流/TCP套接字发送它。然后我必须在接收端接收相同的阵列。

  • 本文向大家介绍JavaScript 通过POST发送和接收JSON数据,包括了JavaScript 通过POST发送和接收JSON数据的使用技巧和注意事项,需要的朋友参考一下 示例 6 提取请求承诺最初将返回Response对象。它们将提供响应头信息,但它们不直接包含响应主体,而响应主体可能尚未加载。可以使用诸如Response对象上的方法来等待响应主体加载,然后对其进行解析。.json()

  • 我想知道我们是否可以将2个蓝牙设备连接到Android设备,并在Android中实时共享数据?i、 e我有一个传感器连接到Android设备,我想流式传输或收听或广播从传感器接收到的数据到耳机(连接到同一个Android设备)。在Android中可能吗??请提出建议。提前谢谢。 我想通过经典蓝牙收听音频流。有可能把Android设备变成接收器吗?目前,我们使用HFP模式和经典蓝牙进行通信。 场景:

  • 当应用程序关闭时,我在使用FCM的聊天中收到有关新消息的通知。当我点击它时,我想打开聊天活动,但主活动会打开。 点击推送通知将打开主活动。在其中,我可以从intent获得一种类型的通知,并打开另一个活动: 在我看来,这种方法既肮脏又不方便。是否可以指定单击推送通知时将打开的活动? 编辑:解决问题的步骤: > 为要打开的活动添加意图过滤器: 向FCM消息添加click_action="you-act

  • 我试着做一个简单的服务器-客户机套接字通信,但服务器似乎无法正常工作。无论何时发送或接收,我都会收到此错误: 非插座上的插座操作:非插座上的插座操作 奇怪的是,这只会在服务器发送时出现。客户似乎还可以: