如何将数据返回给kotlin的呼叫活动?

问题描述

我对如何将数据返回到上一个活动感到困惑。也许是因为以前对点样式的Windows窗体等旧样式有经验。

场景:我的简单android应用以MainActivity开头,以某些单位显示一些值,例如“您身高1.86 m”,并且在菜单栏中有一个工具图标。点击此图标将启动ToolsActivity,用户可以在其中选择一些设置,例如她是否更喜欢美制或公制单位,例如米与英尺。完成后,用户单击顶部栏中的向后箭头以返回MainActivity,该窗口应以所选单位显示值。

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

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结束(或停止,完成或被破坏时)返回MainActivity。 )

最初,我的猜测是将意图用于另一个活动,并且还需要另一个意图来返回上一个活动。

另一种猜测是,您出于意图使用EXTRA数据将数据获取到ToolsActivity,因此也可以使用EXTRA数据将数据获取回MainActivity。

这两种猜测似乎都是幼稚的。

然后我发现了用startActivityForResults(),启动ToolsActivity的目的,因为这样做是为了从第二个活动中获得结果。但是,stories that I kind of grasp是用Java编写的,而使用kotlin的stories from developer.android.com则更为抽象,似乎描述了不同的方法

有人可以给我指出一个简单的kotlin示例,最好将其返回给MainActivity一个简单的String吗?

从简单的Windows应用程序中进行编程,我猜想使用应用程序全局(静态)数据会更加简单。如果可能的话,我们不需要多余的东西和特殊的startActivityForResults()方法,那么也许这也是一条死胡同?


其他信息:

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

解决方法

您走在正确的轨道上,正在考虑使用startActivityForResults,我想所有缺少的就是连接原始活动以接收结果。

在原始活动中,您需要像这样覆盖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) {
        }
    }
}

然后,在您要从中返回信息的活动中,执行以下操作:

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

这是一个示例,但它们都是相似的:Example