碼字不易,且看且珍惜QAQ
向下一個Activity傳遞數據
Intent
在啓動Activity
的時候還可以傳遞數據
思路很簡單,可以把我們想要傳遞的數據暫存在Intent
中,在啓動另一個Activity
後,只需要把這些數據從Intent
中取出來就行了。
比如在FirstActivity
中有一個按鈕,我們想通過這個按鈕將字符串"CUMT"
傳入SecondActivity
中
那麼就可以使用putExtra()
方法向Intent
對象中暫存數據
button.setOnClickListener{
val intent = Intent(this,SecondActivity::class.java)
intent.putExtra("key","CUMT")//向intent中傳遞鍵值對 key--1024
startActivity(intent)
}
再在SecondActivity
中利用getStringExtra()
方法將暫存的數據取出來
class SecondActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.second_layout)
//取出對應鍵的值,存放到extraData變量中
val extraData = intent.getStringExtra("key")
Log.d("SecondActivity","$extraData 已經被取出")
}
}
由於我們傳遞的是字符串,所以使用
getStringExtra()
方法來獲取數據。
如果傳遞的是整型數據,則使用getIntExtra()
方法。
如果傳遞的是布爾型數據,則使用getBooleanExtra()
方法。
返回數據給上一個Activity
如果要通過SecondActivity
將數據傳回FirstActivity
,那麼就要用startActivityForResult()
方法來替代startActivity()
方法。
startActivityForResult()
方法期望在Activity
銷燬的時候能返回一個數據給上一個Activity
那麼我們就需要在FirstActivity
中修改啓動下一個Activity
的方式:
button.setOnClickListener{
val intent1 = Intent(this,SecondActivity::class.java)
//使用startActivityForResult()來啓動SecondActivity
startActivityForResult(intent1,1)
}
startActivityForResult()
方法接收兩個參數:
第一個參數還是Intent
對象;
第二個參數是請求碼,用於在之後的回調中判斷數據的來源
請求碼只要是唯一值即可
然後在SecondActivity
中創建一個用於傳輸數據的Intent
對象,並將此對象傳遞到上一個Activity
,所有操作在按鈕被點擊後執行。
button2.setOnClickListener{
//創建一個用來存儲返回數據的intent
val intent2 = Intent()
intent2.putExtra("key","CUMT")
//將存儲着數據的Intent對象返回到上級Activity
setResult(Activity.RESULT_OK,intent)
//銷燬Activity
finish()
}
setResult()
方法專門用於向上一個Activity
傳遞數據。
第一個參數用於返回處理結果,一般使用RESULT_OK
或RESULT_CANCELED
兩個值。
第二個參數則把帶有數據的Intent
對象傳遞回去。
接下來我們還需要重寫FirstActivity
中的onActivityResult()
方法來得到SecondActivity
返回的數據
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when(requestCode){
1->if(resultCode== Activity.RESULT_OK){
val returnedData = data?.getStringExtra("key")
Log.d("FirstActivity","獲取的數據爲$returnedData")
}
}
}
?.
運算符,只有當data
不爲null
的時候纔會調用getStringExtra()
方法
如果用戶在SecondActivity
中並不是通過點擊按鈕返回的,而是通過系統的返回鍵返回。
若想在這種情況下依然返回數據,則需要重寫SecondActivity
的onBackPressed()
方法來解決這個問題:
override fun onBackPressed() {
super.onBackPressed()
//用於存儲返回的數據
val intent = Intent()
intent.putExtra("key","CUMT")
//將存儲數據的intent返回
setResult(Activity.RESULT_OK,intent)
//銷燬Activity
finish()
}