运行效果
-
计算(同一应用页面跳转)
-
分享(不同应用页面跳转)
-
实现横屏
内容简概
一、搭建界面
二、实现界面之间跳转和传值
三、实现隐式跳转并回调数据
四、Activity生命周期——解决横屏数据丢失
具体内容
一、搭建界面
新建一个项目,在xml中拖动文本控件TextView和Number到界面中,设置链式处理和对应约束,使其在同一水平线上,给一些控件加上id,最后设置Number的textAlignment=center。
接着创建跳转页面DetailActivity,添加一个按钮,设置id
二、实现界面之间跳转和传值
MainActivity
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 给按钮添加点击事件
mNextBtn.setOnClickListener {
Intent().apply {
// 设置值
putExtra("first",mFirst.text.toString().toInt())
putExtra("Second",mSecond.text.toString().toInt())
// 设置从哪个页面跳转到哪个页面
setClass(this@MainActivity,DetailActivity::class.java)
// 跳转
startActivityForResult(this,123)
}
}
}
// 接收回调数据
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode==123){
data?.getIntExtra("result",0).also {
// 将结果赋值到TextView上
mResult.text=it.toString()
}
}
}
}
DetailActivity
class DetailActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_detail)
// 获取传递的数
val first:Int=intent.getIntExtra("first",0)
val second:Int=intent.getIntExtra("second",0)
// 实现按钮的点击事件
mCalculateBtn.setOnClickListener {
// 开始计算
val result:Int=first+second
// 将结果回调给上一个页面
Intent().apply {
putExtra("result",result)
}.also {
setResult(0,it)
}
//返回上一页面
finish()
}
}
}
三、实现隐式跳转并回调数据
- 显式跳转是同一个应用中不同页面的跳转
- 隐式跳转是不同应用之间的跳转
这里我们准备另一个应用,即新建一个项目,添加一个TextView和Button
然后在manifest中添加配置
回到计算器应用的MainActivity中
// 分享按钮事件
mShareBtn.setOnClickListener {
// 设置隐式跳转
Intent().apply {
action = "wxj.wechat"
data=Uri.parse("content:今天完成了Activity的跳转,很棒!")
}.also {
startActivity(it,456)
}
}
wechat应用接收传过来的数据(MainActivity)
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 获取传递过来的数据
intent.data?.schemeSpecificPart.also {
// 显示到TextView中
mTextView.text=it
}
// 返回按钮
mBack.setOnClickListener {
// 回调数据
Intent().apply {
putExtra("shareResult","分享成功")
}.also {
setResult(1,it)
finish()
}
}
}
}
然后计算器应用显示一个弹窗
// 接收回调数据
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode==123){
// 详细计算页面
data?.getIntExtra("result",0).also {
// 将结果赋值到TextView上
mResult.text=it.toString()
}
}
else if (requestCode==456){
// 分享页面
data?.getStringExtra("shareResult").also {
// 弹出一个提示框
Toast.makeText(this,it,Toast.LENGTH_LONG).show()
}
}
}
四、Activity生命周期——解决横屏数据丢失
按上述操作完成后还有一个问题,就是手机横屏旋转后,计算结果变成0,这是由于屏幕旋转会导致页面销毁重建,新建页面并没有发生点击事件导致的,针对这个问题,我们可以用一个文件保存这个值,需要时从文件调出。
【解决方法】在计算器应用的MainActivity的onCreate方法中增加
// 获取保存的数据
savedInstanceState?.getString("content","").also {
mResult.text=it
}
MainActivity增加以下方法
// 界面被销毁时会调用这个方法 保存数据
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("content",mResult.text.toString())
}
这样就能保留原来的计算结果。
不过还有个问题,就是wechat应用添加这条语句后,手机上就不显示该应用的图标了,百度了半天也没找到个所以然,如果路过大佬知道,希望可以指点一二。