如何将 return 数据传递给 kotlin 中的调用 activity?

How to return data to the calling activity in kotlin?

我对如何 return 数据回到以前的 activity 感到困惑。也许是因为以前使用旧样式的经验,例如点网中的 windows 形式。

场景:我的简单 android 应用从 MainActivity 开始,以某些单位显示某些值,例如'you are 1.86 m tall',并且在菜单栏中有一个工具图标。单击此图标会启动 ToolsActivity,用户可以在其中 select 一些设置,比如她更喜欢美制还是公制单位,例如米与英尺。完成后,用户单击顶部栏中的后退箭头 return 到 MainActivity,这应该以 selected 单位显示值。

这是我存储当前单位系统设置的方式:

const val EXTRA_UNITSYSTEM = ".UNITSYSTEM"
class MainActivity : AppCompatActivity() {
    var TheUnitSystem : String = "metric"

我发现了如何在 MainActivity 中的 startActivity() 意图中使用 putExtra() 来启动 ToolsActivity,:

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.tools -> {
            val intent = Intent(this, ToolsActivity::class.java)                 
            intent.putExtra(EXTRA_UNITSYSTEM, TheUnitSystem)
            startActivity(intent)

getStringExtra() 获取 ToolsActivity 中 TheUnitSystem 的当前值,以便可以将单选按钮初始化为当前设置:

class ToolsActivity : AppCompatActivity() {
  var TheUnitSystem: String = ""

  override fun onCreate(savedInstanceState: Bundle?) {
    ...
    this.TheUnitSystem = intent.getStringExtra(EXTRA_UNITSYSTEM)!!

这确实有效,但留下了如何在 ToolsActivity 结束(或停止,或完成,或被摧毁...)

最初,我的猜测是 intents 用于转到另一个 activity,并且它需要另一个 intent 才能返回到先前的 activity。

另一种猜测是,您使用 EXTRA 意图上的数据将数据获取到 ToolsActivity,因此不知何故 EXTRA 数据也将用于将数据返回到 MainActivity。

这两种猜测似乎都很天真

然后我发现了如何使用 startActivityForResults(), 启动 ToolsActivity,因为这是为了从第二个 activity 获取结果而设计的。然而,使用 kotlin 的 stories that I kind of grasp are in java, and the stories from developer.android.com 更加抽象,并且似乎描述了不同的方法。

有人可以给我指出一个基本的 kotlin 示例,以便 return 将一个简单的字符串返回 MainActivity,最好使用 startActivityForResults() 吗?

从简单的 Windows 应用程序编程来看,我猜想使用应用程序全局(静态)数据会更简单。如果可能的话,我们应该不需要额外的东西和特殊的 ForResult() 方法,所以也许这也是一条死胡同?


额外信息:

可能使我的简单项目有点特别的是,我在第二个 activity 的布局中没有用于返回 MainActivity 的按钮。第二个 activity 从单击工具栏小部件上的 MenuItem 开始,在 res/menu/menu_main.xml 布局中定义。第二个 activity 在顶部栏中显示了一个后退箭头,这不在第二个 activity 的布局中。优点是它真的是一个设置屏幕。缺点是它不是普通的 activity,您可以像大多数编码示例那样在布局中放置后退按钮。

您走在正确的轨道上,正在考虑使用 startActivityForResults,我猜所缺少的只是连接原始 activity 以接收结果。

在原来的activity中你需要像这样覆盖onActivityResult:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    super.onActivityResult(requestCode, resultCode, data)

    // If you have multiple activities returning results then you should include unique request codes for each 
    if (requestCode == <pick a code>) {

        // The result code from the activity started using startActivityForResults 
        if (resultCode == Activity.RESULT_OK) {
        }
    }
}

然后,在 activity 你想要 return 的信息中,做这样的事情:

val intent = Intent()
intent.putExtra("ActivityResult", "<Data to return>")
setResult(RESULT_OK, intent)
finish()

这是一个例子,但它们都很相似:Example