Activity間數據的傳輸-android-kotlin

碼字不易,且看且珍惜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_OKRESULT_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中並不是通過點擊按鈕返回的,而是通過系統的返回鍵返回。

若想在這種情況下依然返回數據,則需要重寫SecondActivityonBackPressed()方法來解決這個問題:

override fun onBackPressed() {
    super.onBackPressed()
    //用於存儲返回的數據
    val intent = Intent()
    intent.putExtra("key","CUMT")
    //將存儲數據的intent返回
    setResult(Activity.RESULT_OK,intent)
    //銷燬Activity
    finish()
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章