Android面向單Activity開(kāi)發(fā)示例解析
正文
記得前一兩年很多人都跟風(fēng)面向單Activity開(kāi)發(fā),顧名思義,就是整個(gè)項(xiàng)目只有一個(gè)Activity。一個(gè)Activity里面裝著N多個(gè)Fragment,再給Fragment加上轉(zhuǎn)場(chǎng)動(dòng)畫(huà),效果和多Activity跳轉(zhuǎn)無(wú)異。其實(shí)想想還比較酷,以前還需要關(guān)注多個(gè)Acitivity之間的生命周期,現(xiàn)在只需關(guān)注一個(gè),但還是需要對(duì)Fragment的生命周期進(jìn)行關(guān)注。
其實(shí)早在六七年前GitHub上就有單Activity的開(kāi)源庫(kù)Fragmentation,后來(lái)谷歌也出了一個(gè)庫(kù)Navigation。本來(lái)以為官方出品必為經(jīng)典,當(dāng)時(shí)跟著官方文檔一步一步踩坑,最后還是放棄了該方案。理由大概如下:
- 需要?jiǎng)?chuàng)建XML文件,配置導(dǎo)航關(guān)系和跳轉(zhuǎn)參數(shù)等
- 頁(yè)面回退是重新創(chuàng)建,需要配合livedata使用
- 貌似還會(huì)存在卡頓,一些棧內(nèi)跳轉(zhuǎn)處理等問(wèn)題
而Github上Fragmentation庫(kù)已經(jīng)停止維護(hù),所幸的是再lssuse中發(fā)現(xiàn)了一個(gè)基于它繼續(xù)維護(hù)的SFragmentation,于是正是開(kāi)啟了面向單Activity的開(kāi)發(fā)。
提供了可滑動(dòng)返回的版本
dependencies { //請(qǐng)使用最新版本 implementation 'com.github.weikaiyun.SFragmentation:fragmentation:latest' //滑動(dòng)返回,可選 implementation 'com.github.weikaiyun.SFragmentation:fragmentation_swipeback:latest' }
由于是Fragment之間的跳轉(zhuǎn),我們需要將原有的Activity跳轉(zhuǎn)動(dòng)畫(huà)在框架初始化時(shí)設(shè)置到該框架中
Fragmentation.builder() //設(shè)置 棧視圖 模式為 (默認(rèn))懸浮球模式 SHAKE: 搖一搖喚出 NONE:隱藏, 僅在Debug環(huán)境生效 .stackViewMode(Fragmentation.BUBBLE) .debug(BuildConfig.DEBUG) .animation( R.anim.public_translate_right_to_center, //進(jìn)入動(dòng)畫(huà) R.anim.public_translate_center_to_left, //隱藏動(dòng)畫(huà) R.anim.public_translate_left_to_center, //重新出現(xiàn)時(shí)的動(dòng)畫(huà) R.anim.public_translate_center_to_right //退出動(dòng)畫(huà) ) .install()
因?yàn)橹挥幸粋€(gè)Activity,所以需要在這個(gè)Activity中裝載根Fragment
loadRootFragment(int containerId, SupportFragment toFragment)
但現(xiàn)在的APP幾乎都是一個(gè)頁(yè)面多個(gè)Tab組成的怎么辦呢?
loadMultipleRootFragment(int containerId, int showPosition, SupportFragment... toFragments);
有了多個(gè)Fragment的顯示,我們需要切換Tab實(shí)際也很簡(jiǎn)單
showHideFragment(ISupportFragment showFragment);
是不是使用起來(lái)很簡(jiǎn)單,首頁(yè)我們解決了,關(guān)于跳轉(zhuǎn)和返回、參數(shù)的接受和傳遞呢?
//啟動(dòng)目標(biāo)fragment start(SupportFragment fragment) //帶返回的啟動(dòng)方式 startForResult(SupportFragment fragment,int requestCode) //接收返回參數(shù) override fun onFragmentResult(requestCode: Int, resultCode: Int, data: Bundle?) { super.onFragmentResult(requestCode, resultCode, data) } //返回到上個(gè)頁(yè)面,和activity的back()類(lèi)似 pop()
對(duì)于單Activity而言,我們其實(shí)也可以注冊(cè)一個(gè)全局的Fragment監(jiān)聽(tīng),這樣就能掌控當(dāng)前的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 )
接下來(lái)我們看看Pad應(yīng)用。對(duì)于手機(jī)應(yīng)用來(lái)說(shuō),一般不會(huì)存在局部頁(yè)面跳轉(zhuǎn)的情況,但是Pad上是常規(guī)操作。
如圖,點(diǎn)擊左邊列表的單個(gè)item,右邊需要顯示詳情,這時(shí)候再點(diǎn)左邊的其他item,此時(shí)的左邊頁(yè)面是保持不動(dòng)的,但右邊的詳情頁(yè)需要跳轉(zhuǎn)對(duì)應(yīng)的頁(yè)面。使用過(guò)Pad的應(yīng)該經(jīng)常見(jiàn)到這種頁(yè)面,比如Pad的系統(tǒng)設(shè)置等頁(yè)面。這時(shí)只使用Activty應(yīng)該是不能實(shí)現(xiàn)的,必須配合Fragment,左右分為兩個(gè)Fragment。
但問(wèn)題又出現(xiàn)了,這時(shí)候點(diǎn)擊back怎么區(qū)分局部返回和整個(gè)頁(yè)面返回呢?
//整個(gè)頁(yè)面回退,主要是用于當(dāng)前裝載了Fragment的頁(yè)面回退 _mActivity.pop() //局部回退,被裝載的Fragment之間回退 pop()
如下圖,這樣的頁(yè)面我們又應(yīng)該怎么裝載呢?
可以分析,頁(yè)面最外面是一個(gè)Activty,要實(shí)現(xiàn)單Activity其內(nèi)部必裝載了一個(gè)根Fragment。接著這個(gè)根Fragment中使用ViewPage和tablayout完成主頁(yè)框架。當(dāng)前tab頁(yè)要滿(mǎn)足右邊詳情頁(yè)的單獨(dú)跳轉(zhuǎn),還得將右邊頁(yè)面作為主頁(yè)面,以此裝載子Fragment才能實(shí)現(xiàn)。
總結(jié)
單Activity開(kāi)發(fā)在手機(jī)和平板上使用都一樣,但在平板上注意的地方更多,尤其是平板一個(gè)頁(yè)面可能是多個(gè)頁(yè)面組成,其局部還能單獨(dú)跳轉(zhuǎn)的功能,其中涉及到參數(shù)回傳和棧的回退問(wèn)題。使用下來(lái),我還是覺(jué)得某些頁(yè)面對(duì)硬件要求很高的使用單Activity會(huì)出現(xiàn)體驗(yàn)不好的情況,有可能是優(yōu)化不到位。手機(jī)應(yīng)用我還是使用多Activity方式,平板應(yīng)用則使用該框架實(shí)現(xiàn)單Activity方式。
以上就是Android面向單Activity開(kāi)發(fā)示例解析的詳細(xì)內(nèi)容,更多關(guān)于Android面向單Activity開(kāi)發(fā)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Android registerForActivityResult動(dòng)態(tài)申請(qǐng)權(quán)限案例詳解
- ActivityManagerService廣播并行發(fā)送與串行發(fā)送示例解析
- ActivityManagerService廣播注冊(cè)與發(fā)送示例解析
- ActivityManagerService之Service啟動(dòng)過(guò)程解析
- Vue3源碼分析reactivity實(shí)現(xiàn)方法示例
- vue3源碼分析reactivity實(shí)現(xiàn)原理
- Android10 App啟動(dòng)Activity源碼分析
- Android?Activity共享元素動(dòng)畫(huà)示例解析
- Android?registerForActivityResult新用法實(shí)現(xiàn)兩個(gè)Activity間數(shù)據(jù)傳遞
相關(guān)文章
Android 兩個(gè)Fragment之間的跳轉(zhuǎn)和數(shù)據(jù)的傳遞實(shí)例詳解
這篇文章主要介紹了Android 兩個(gè)Fragment之間的跳轉(zhuǎn)和數(shù)據(jù)的傳遞實(shí)例詳解的相關(guān)資料,這里說(shuō)明實(shí)現(xiàn)的思路及實(shí)現(xiàn)方法,需要的朋友可以參考下2017-07-07Android左滑返回功能的實(shí)現(xiàn)示例代碼
本篇文章主要介紹了Android左滑返回的實(shí)現(xiàn)示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07Android利用Flutter實(shí)現(xiàn)立體旋轉(zhuǎn)效果
本文主要介紹了Flutter繪圖如何使用ImageShader填充圖形,并且利用 Matrix4的三維變換加上動(dòng)畫(huà)實(shí)現(xiàn)了立體旋轉(zhuǎn)的動(dòng)畫(huà)效果,感興趣的可以嘗試一下2022-06-06Android USB轉(zhuǎn)串口通信開(kāi)發(fā)實(shí)例詳解
這篇文章主要介紹了 Android USB轉(zhuǎn)串口通信開(kāi)發(fā)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04Android 使用Path實(shí)現(xiàn)涂鴉功能
到月底了最近比較空閑,今天抽空給大家實(shí)現(xiàn)一個(gè)涂鴉效果,會(huì)分幾步實(shí)現(xiàn),這里有一個(gè)重要的知識(shí)點(diǎn)就是圖層,要理解這個(gè)。下面先從簡(jiǎn)單的說(shuō)起,一起看看代碼吧2016-12-12Android中自定義ImageView添加文字設(shè)置按下效果詳解
這篇文章主要給大家介紹了關(guān)于Android中自定義ImageView添加文字設(shè)置按下效果的相關(guān)資料,實(shí)現(xiàn)后的效果非常利用用戶(hù)的體驗(yàn),文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)下吧。2017-08-08Android自定義view之圍棋動(dòng)畫(huà)效果的實(shí)現(xiàn)
這篇文章主要介紹了Android自定義view之圍棋動(dòng)畫(huà)效果的實(shí)現(xiàn),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12Android SharedPreferences的使用分析
本篇文章小編為大家介紹,Android SharedPreferences的使用分析。需要的朋友參考下2013-04-04