如何将 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
我对如何 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