網(wǎng)站首頁 編程語言 正文
正文
記得前一兩年很多人都跟風面向單Activity開發(fā),顧名思義,就是整個項目只有一個Activity。一個Activity里面裝著N多個Fragment,再給Fragment加上轉(zhuǎn)場動畫,效果和多Activity跳轉(zhuǎn)無異。其實想想還比較酷,以前還需要關注多個Acitivity之間的生命周期,現(xiàn)在只需關注一個,但還是需要對Fragment的生命周期進行關注。
其實早在六七年前GitHub上就有單Activity的開源庫Fragmentation,后來谷歌也出了一個庫Navigation。本來以為官方出品必為經(jīng)典,當時跟著官方文檔一步一步踩坑,最后還是放棄了該方案。理由大概如下:
- 需要創(chuàng)建XML文件,配置導航關系和跳轉(zhuǎn)參數(shù)等
- 頁面回退是重新創(chuàng)建,需要配合livedata使用
- 貌似還會存在卡頓,一些棧內(nèi)跳轉(zhuǎn)處理等問題
而Github上Fragmentation庫已經(jīng)停止維護,所幸的是再lssuse中發(fā)現(xiàn)了一個基于它繼續(xù)維護的SFragmentation,于是正是開啟了面向單Activity的開發(fā)。
提供了可滑動返回的版本
dependencies {
//請使用最新版本
implementation 'com.github.weikaiyun.SFragmentation:fragmentation:latest'
//滑動返回,可選
implementation 'com.github.weikaiyun.SFragmentation:fragmentation_swipeback:latest'
}
由于是Fragment之間的跳轉(zhuǎn),我們需要將原有的Activity跳轉(zhuǎn)動畫在框架初始化時設置到該框架中
Fragmentation.builder()
//設置 棧視圖 模式為 (默認)懸浮球模式 SHAKE: 搖一搖喚出 NONE:隱藏, 僅在Debug環(huán)境生效
.stackViewMode(Fragmentation.BUBBLE)
.debug(BuildConfig.DEBUG)
.animation(
R.anim.public_translate_right_to_center, //進入動畫
R.anim.public_translate_center_to_left, //隱藏動畫
R.anim.public_translate_left_to_center, //重新出現(xiàn)時的動畫
R.anim.public_translate_center_to_right //退出動畫
)
.install()
因為只有一個Activity,所以需要在這個Activity中裝載根Fragment
loadRootFragment(int containerId, SupportFragment toFragment)
但現(xiàn)在的APP幾乎都是一個頁面多個Tab組成的怎么辦呢?
loadMultipleRootFragment(int containerId, int showPosition, SupportFragment... toFragments);
有了多個Fragment的顯示,我們需要切換Tab實際也很簡單
showHideFragment(ISupportFragment showFragment);
是不是使用起來很簡單,首頁我們解決了,關于跳轉(zhuǎn)和返回、參數(shù)的接受和傳遞呢?
//啟動目標fragment
start(SupportFragment fragment)
//帶返回的啟動方式
startForResult(SupportFragment fragment,int requestCode)
//接收返回參數(shù)
override fun onFragmentResult(requestCode: Int, resultCode: Int, data: Bundle?) {
super.onFragmentResult(requestCode, resultCode, data)
}
//返回到上個頁面,和activity的back()類似
pop()
對于單Activity而言,我們其實也可以注冊一個全局的Fragment監(jiān)聽,這樣就能掌控當前的Fragmnet
supportFragmentManager.registerFragmentLifecycleCallbacks(
object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentAttached(fm: FragmentManager, f: Fragment, context: Context) {
super.onFragmentAttached(fm, f, context)
}
override fun onFragmentCreated(
fm: FragmentManager,
f: Fragment,
savedInstanceState: Bundle?
) {
super.onFragmentCreated(fm, f, savedInstanceState)
}
override fun onFragmentStarted(fm: FragmentManager, f: Fragment) {
super.onFragmentStarted(fm, f)
}
override fun onFragmentResumed(fm: FragmentManager, f: Fragment) {
super.onFragmentResumed(fm, f)
}
override fun onFragmentDestroyed(fm: FragmentManager, f: Fragment) {
super.onFragmentDestroyed(fm, f)
}
},
true
)
接下來我們看看Pad應用。對于手機應用來說,一般不會存在局部頁面跳轉(zhuǎn)的情況,但是Pad上是常規(guī)操作。
如圖,點擊左邊列表的單個item,右邊需要顯示詳情,這時候再點左邊的其他item,此時的左邊頁面是保持不動的,但右邊的詳情頁需要跳轉(zhuǎn)對應的頁面。使用過Pad的應該經(jīng)常見到這種頁面,比如Pad的系統(tǒng)設置等頁面。這時只使用Activty應該是不能實現(xiàn)的,必須配合Fragment,左右分為兩個Fragment。
但問題又出現(xiàn)了,這時候點擊back怎么區(qū)分局部返回和整個頁面返回呢?
//整個頁面回退,主要是用于當前裝載了Fragment的頁面回退
_mActivity.pop()
//局部回退,被裝載的Fragment之間回退
pop()
如下圖,這樣的頁面我們又應該怎么裝載呢?
可以分析,頁面最外面是一個Activty,要實現(xiàn)單Activity其內(nèi)部必裝載了一個根Fragment。接著這個根Fragment中使用ViewPage和tablayout完成主頁框架。當前tab頁要滿足右邊詳情頁的單獨跳轉(zhuǎn),還得將右邊頁面作為主頁面,以此裝載子Fragment才能實現(xiàn)。
總結
單Activity開發(fā)在手機和平板上使用都一樣,但在平板上注意的地方更多,尤其是平板一個頁面可能是多個頁面組成,其局部還能單獨跳轉(zhuǎn)的功能,其中涉及到參數(shù)回傳和棧的回退問題。使用下來,我還是覺得某些頁面對硬件要求很高的使用單Activity會出現(xiàn)體驗不好的情況,有可能是優(yōu)化不到位。手機應用我還是使用多Activity方式,平板應用則使用該框架實現(xiàn)單Activity方式。
原文鏈接:https://juejin.cn/post/7204100079430123557
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-04-11 canvas實現(xiàn)畫板功能
- 2022-07-07 ASP.NET對Cookie的操作_ASP.NET
- 2022-09-18 AJAX實現(xiàn)文件上傳功能報錯Current?request?is?not?a?multipart?r
- 2022-08-21 golang字符串本質(zhì)與原理詳解_Golang
- 2022-11-05 Android?TabLayout?自定義樣式及使用詳解_Android
- 2022-07-04 圖神經(jīng)網(wǎng)絡GNN算法基本原理詳解_python
- 2022-10-30 Python利用Pandas進行數(shù)據(jù)分析的方法詳解_python
- 2024-03-28 存儲過程整合springboot
- 欄目分類
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支