Android Kotlin 无法从另一个活动中获取结果
Posted
技术标签:
【中文标题】Android Kotlin 无法从另一个活动中获取结果【英文标题】:Android Kotlin not able to get result from another activity 【发布时间】:2021-10-11 03:41:57 【问题描述】:我需要从我的主要活动开始一个活动,第二个活动必须进行 REST 调用(我正在使用 OkHttp)并将结果返回给主要活动。我实际上能够完成所有过程,但是当我回到主要活动时,我无法获得结果数据。代码如下:
class MainActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) result: ActivityResult ->
val data: Intent? = result.data
Log.d("Main", data.toString())
findViewById<Button>(R.id.button).setOnClickListener
val intent = Intent(this, SecondActivity::class.java)
resultLauncher.launch(intent)
class SecondActivity : AppCompatActivity()
override fun onCreate(savedInstanceState: Bundle?)
super.onCreate(savedInstanceState)
setContentView(R.layout.second_activity)
customFunction(this)
private fun customFunction(activity: Activity)
var json: String? = ""
val payload = "custom payload"
val okHttpClient = OkHttpClient()
val requestBody = payload.toRequestBody()
val request = Request.Builder()
.header("Authorization", "Basic mytoken")
.header("Content-Type", "application/x-www-form-urlencoded")
.url("myurl")
.method("POST", requestBody)
.build()
okHttpClient.newCall(request).enqueue(object : Callback
override fun onFailure(call: Call, e: IOException)
Log.d("SecondActivity", "onFailure")
activity.finish()
override fun onResponse(call: Call, response: Response)
json = response.body?.string()
Log.d("SecondActivity", "$json")
val data = Intent()
data.putExtra("json", json)
Log.d("SecondActivity", data.toString())
activity.setResult(Activity.RESULT_OK, data)
activity.finish()
)
所以,在customFunction()
中,我能够获取该json 并将其放入数据意图中。事实上,当我用Log.d()
打印它时,它会显示Intent (has extras)
,所以没关系。但是当我在 registerForActivityResult
的 MainActivity 中收到它时,它会打印出 null
。我做错了什么?
【问题讨论】:
【参考方案1】:在这种情况下,您必须在MainActivity
的启动器活动中获得额外的Intent
,即
而不是
var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) result: ActivityResult ->
val data: Intent? = result.data
Log.d("Main", data.toString())
使用
var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) result: ActivityResult ->
val data: Intent? = result.data
val actualExtraData = data.getExtra("json") // Here is your actual data
Log.d("Main", data.toString())
【讨论】:
我尝试使用val actualExtraData = data?.extras?.get("json")
和 Log.d("Main", actualExtraData .toString())
但仍然为空
如果我直接打印result
,我会得到ActivityResultresultCode=RESULT_CANCELED, data=null
也许响应没有被正确序列化
如何解决?【参考方案2】:
在 SecondActivity
中,您正在使用方法 putExtra
并将值 json
作为 String 传递。所以在 MainActivity 中得到它
val data = result.data?.getStringExtra("json")
var resultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) result: ActivityResult ->
// val data: Intent? = result.data
val data = result.data?.getStringExtra("json")
Log.d("Main", data.toString())
【讨论】:
仍然是null
。如上一条评论所述,如果我直接打印result
,我会得到ActivityResultresultCode=RESULT_CANCELED, data=null
json = response.body()?.string() 检查这一行你的方法,是body?好的?还是body()?
如果我在第二个活动中打印json
,我可以看到实际的 json 对象。因此,当我回到主要活动时,就会出现问题。 setResult()
方法似乎无法正常工作或根本无法正常工作。
您使用的是 android:launchMode singleTask 还是 singleInstance ,请检查您的清单文件。
我的清单文件中没有android:launchMode
以上是关于Android Kotlin 无法从另一个活动中获取结果的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Kotlin 中创建一个打开新活动(Android Studio)的按钮?
无法在带有 Kotlin 的 Android 中使用 Autodispose