【问题标题】:push string to array from another activity将字符串从另一个活动推送到数组
【发布时间】:2019-01-11 09:40:37
【问题描述】:

my aplication

我有 2 个活动,第一个是 CategoryActivity,第二个是 QuestionActivity。 在 CategoryActivity 我有一个列出类别的 recyclerview,在 Category Activity 中,我有一个数组。当我点击eksterior时,它会转到questionActivity,当我点击提交时,它会返回CategoryActivity并将数据发送到CategotyActivity。发送的数据被输入到数组中,所以数组是这样的:array [] = {“1”};然后我点击recyclerview内部的第二个项目,然后它会再次进入QuestionActivity,当我点击提交时,它会将数据发送到CategoryActivity并将其添加到上一个数组中,所以数组将是这样的:array [] = {“1”,”1”};以此类推,直到recyclerview上的项目用完。我试过这样:

QuestionActivity.kt

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

    button_save.setOnClickListener(){
        val intent = Intent(this@ResultActivity, KategoriActivity::class.java)
        intent.putExtra(KategoriActivity.Companion.ARRAY, "1")
        startActivity(intent)
    }
}

CategoryActivity.kt

var list = arrayOf(intent.getStringExtra(ARRAY))
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_category)
    Toast.makeText(this@KategoriActivity, ""+ list, Toast.LENGTH_SHORT).show()


}
companion object {
    val ARRAY = "array"

}

override fun onBackPressed() {
    Toast.makeText(this@KategoriActivity, ""+ list, Toast.LENGTH_SHORT).show()
    if (list.size == kategoriDatas!!.size){
        onBackPressed()
    } else {
        val builder = AlertDialog.Builder(this)
        builder.setMessage("You Must Finish All The Category")

        // add a button
        builder.setPositiveButton("OK", null)

        // create and show the alert dialog
        val dialog = builder.create()
        dialog.show()
    }
    }

问题是当我打开类别活动时,应用程序停止,日志显示Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Intent.getStringExtra(java.lang.String)' on a null object reference

数据无法推送到数组,请帮帮我

【问题讨论】:

  • 把你的var list = arrayOf(intent.getStringExtra(ARRAY))放在setContentView下面。
  • 应用程序没有停止但 toast 显示 [Ljava.lang.String;@8e6837c
  • @Prexx 我已经编辑了我的问题

标签: android arrays kotlin


【解决方案1】:

您只能在活动创建后才能获得意图。为了确保这一点,最好将可以从 Intents 中获取额外内容的代码放在 onCreate 中。

像这样:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_category)
    Toast.makeText(this@KategoriActivity, ""+ list, Toast.LENGTH_SHORT).show()
    var list = arrayOf(intent.getStringExtra(ARRAY))
}

如果你想拥有一个保存信息的应用程序类:

class MyApplication : Application(){
var list = emptyArray<String>()

  override fun onCreate() {
    super.onCreate()
  }
}

在你的活动中使用它:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_category)
    Toast.makeText(this@KategoriActivity, ""+ list, Toast.LENGTH_SHORT).show()
    var list = (application as MyApplication).list
   // you can than use it to update or retrieve values from it
}

【讨论】:

  • 是的,但是 toast 是 show [Ljava.lang.String;@8e6837c
  • 因为你得到了额外的数组。如果您只想要您当前在示例中传递的字符串(“1”),您应该执行 var extra = intent.getStringExtra(ARRAY)。如果您想在多个活动中来回传递一致的数组,那么这不是最好的解决方案。您应该在某个地方有一个存储库,其中包含该数组或一个 Application 类,该类在您的应用程序运行的整个过程中都保存该数组。
  • 你能给我举个例子吗?
  • 我会给你一个Application类的例子。至于 repo,您​​应该考虑使用直接连接到回收站视图的新 Android 组件。直接链接developer.android.com/topic/libraries/architecture github 示例github.com/googlesamples/android-sunflower 我已经编辑了我的应用程序答案
  • 尝试使用Arrays.toString(list)list.joinToString() 将您的数组转换为字符串
猜你喜欢
  • 2018-09-24
  • 1970-01-01
  • 2017-02-09
  • 2013-08-11
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多