網(wǎng)站首頁 編程語言 正文
Android?Activity?Results?API代替onActivityResult處理頁面數(shù)據(jù)_Android
作者:兒歌八萬首 ? 更新時(shí)間: 2022-11-01 編程語言onActivityResult
@SuppressWarnings("deprecation")
@Override
@CallSuper
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
mFragments.noteStateNotSaved();
super.onActivityResult(requestCode, resultCode, data);
}
Activity Results API的使用
在最新beta版本中谷歌推薦使用Activity Results API來處理頁面數(shù)據(jù)的處理。通過新的 Activity Result API,我們可以單獨(dú)的類中處理結(jié)果回調(diào),真正做到 單一職責(zé) 。
1.在app下的build.gradle中加入依賴:
implementation 'androidx.activity:activity-ktx:1.2.0-beta01'
implementation 'androidx.fragment:fragment-ktx:1.3.0-beta01'
2.自定義ActivityResultContract
自定義ActivityResultContract,用來處理兩個(gè)activity互傳數(shù)據(jù)的處理,替代onActivityResult方法 其中ActivityResultContract<String, String>第一個(gè)泛型參數(shù)表示輸入的參數(shù)類型,即要帶到下一個(gè)Activity的數(shù)據(jù)類型, 第二個(gè)泛型參數(shù)表示輸出參數(shù)類型,即第二個(gè)Activity回傳第一個(gè)Activity的數(shù)據(jù)類型。
class CustomActivityResultContract : ActivityResultContract<String, String>() {
override fun createIntent(context: Context, input: String?): Intent {
//要傳到下一個(gè)activity中的數(shù)據(jù),從A activity中帶到B activity中的數(shù)據(jù)。
return Intent(context, SecondActivity::class.java).putExtra("name", input)
}
override fun parseResult(resultCode: Int, intent: Intent?): String {
//從activity回傳的數(shù)據(jù)
val result = intent?.getStringExtra("result") //從B activity中回傳的數(shù)據(jù)。
if (resultCode == Activity.RESULT_OK && result != null) {
return "$result"
}
return ""
}
}
3.注冊(cè)ActivityResult協(xié)議
在A activity中注冊(cè)ActivityResult協(xié)議,使用我們剛剛定義的CustomActivityResultContract。
registerForActivityResult方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是傳入對(duì)應(yīng)的Contract,第二個(gè)參數(shù)是回調(diào)結(jié)果callback。
private val activityLauncher = registerForActivityResult(CustomActivityResultContract()) {
//第二個(gè)頁面關(guān)閉后回到第一個(gè)頁面的回調(diào)方法
tvName.text = it
}
4.調(diào)用launch方法開啟界面跳轉(zhuǎn)
使用第三步我們生成的啟動(dòng)器對(duì)象的launch方法來啟動(dòng)界面跳轉(zhuǎn),launch方法需要傳入一個(gè)輸入?yún)?shù),也就是需要帶到下一個(gè)頁面的參數(shù),可以是任意對(duì)象:
btnStartSecond.setOnClickListener {
//點(diǎn)擊跳轉(zhuǎn)到SecondActivity
activityLauncher.launch("我是第一個(gè)頁面?zhèn)鬟^去的參數(shù)")
}
5.使用谷歌內(nèi)置的 ActivityResultContract來進(jìn)行頁面跳轉(zhuǎn)
還可以通過ActivityResultContracts類來調(diào)用谷歌為我們內(nèi)置的Contract,其中包含來各種常用的Contract
- @StartActivityForResult: 通用的Contract,不做任何轉(zhuǎn)換,Intent作為輸入,ActivityResult作為輸出,這也是最常用的一個(gè)協(xié)定。
- @RequestMultiplePermissions: 用于請(qǐng)求一組權(quán)限
- @RequestPermission: 用于請(qǐng)求單個(gè)權(quán)限
- @TakePicturePreview: 調(diào)用MediaStore.ACTION_IMAGE_CAPTURE拍照,返回值為Bitmap圖片
- @TakePicture: 調(diào)用MediaStore.ACTION_IMAGE_CAPTURE拍照,并將圖片保存到給定的Uri地址,返回true表示保存成功。
- @TakeVideo: 調(diào)用MediaStore.ACTION_VIDEO_CAPTURE 拍攝視頻,保存到給定的Uri地址,返回一張縮略圖。
- @PickContact: 從通訊錄APP獲取聯(lián)系人
- @GetContent: 提示用選擇一條內(nèi)容,返回一個(gè)通過ContentResolver#openInputStream(Uri)訪問原生數(shù)據(jù)的Uri地址(content://形式) 。默認(rèn)情況下,它增加了Intent#CATEGORY_OPENABLE, 返回可以表示流的內(nèi)容。
- @CreateDocument: 提示用戶選擇一個(gè)文檔,返回一個(gè)(file:/http:/content:)開頭的Uri。
- @OpenMultipleDocuments: 提示用戶選擇文檔(可以選擇多個(gè)),分別返回它們的Uri,以List的形式。
- @OpenDocumentTree: 提示用戶選擇一個(gè)目錄,并返回用戶選擇的作為一個(gè)Uri返回,應(yīng)用程序可以完全管理返回目錄中的文檔。
一般情況下使用StartActivityForResult就可以滿足大部分需求啦。
private val activityResultLauncher =
registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == RESULT_OK) {
val result = intent?.getStringExtra("result")
tvName.text = result
}
}
btnStartSecond.setOnClickListener {
//點(diǎn)擊跳轉(zhuǎn)到SecondActivity
val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("name", "我是第一個(gè)頁面?zhèn)鬟^去的參數(shù)")
activityResultLauncher.launch(intent)
}
使用系統(tǒng)內(nèi)置的ActivityResultContract可以很方便的實(shí)現(xiàn)頁面間傳值來,這樣也可以實(shí)現(xiàn)解偶操作了。
原文鏈接:https://blog.csdn.net/cj641809386/article/details/109363834
相關(guān)推薦
- 2022-12-19 C++?Boost?Coroutine使用協(xié)程詳解_C 語言
- 2022-05-06 SQLite3+Qt開發(fā):SQLite3簡(jiǎn)要介紹+在Qt5中使用步驟
- 2022-04-01 將numpy array保存為nii格式 itk-snap打不開
- 2024-01-29 理解并使用 XPath 中的 `normalize-space` 函數(shù)
- 2023-05-29 linux?rename?批量修改文件名的操作方法_linux shell
- 2022-10-06 Android開發(fā)Jetpack組件Room使用講解_Android
- 2022-06-11 Task提高異步執(zhí)行效率技巧_C#教程
- 2023-06-16 Pytorch中的?torch.distributions庫詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支