问题描述
我对如何将数据返回到上一个活动感到困惑。也许是因为以前对点样式的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