日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

谷歌电子市场开发记录(2)-框架搭建

發(fā)布時(shí)間:2024/8/1 编程问答 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 谷歌电子市场开发记录(2)-框架搭建 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
上一篇博客說(shuō)了開(kāi)發(fā)前的準(zhǔn)備工作,現(xiàn)在就要開(kāi)始正式開(kāi)發(fā)了。 在項(xiàng)目開(kāi)發(fā)時(shí),難免需要使用到常用的一些對(duì)象,比如說(shuō)Context上下文,經(jīng)常需要使用,因此,此處,可以新建一個(gè)全局的Application,將常用的一些對(duì)象先new好,以便以后直接調(diào)用。 1.新建一個(gè)GlobalApplication類,繼承Application,實(shí)現(xiàn)OnCreate()方法,在這個(gè)類中,需要初始化三個(gè)對(duì)象。 (1)Context mContext=getApplicationContext();上下文經(jīng)常需要使用使用,因此,在此處先得到。 (2)Handler mHandler=new Handler();Handler對(duì)象在處理多線程,消息隊(duì)列時(shí)需要經(jīng)常使用,此項(xiàng)目需要處理多線程下載,Handler更顯得至關(guān)重要。 (3)int MainThreadId=android.os.Process.myTid();獲得主線程Id,因?yàn)橐幚矶嗑€程,而處理UI時(shí),必須在主線程處理,因此,需要得到主線程Id,從而判斷某個(gè)處理是否運(yùn)行在主線程 在初始化之后,提取作為全局成員,并得到get()方法。 2.為了處理UI中的一些邏輯,將一些必用的方法封裝為一個(gè)工具類。新建一個(gè)工具類UIUtils,在這個(gè)類中,封裝很多方法。 (1)根據(jù)id得到字符串,字符串?dāng)?shù)組,顏色值,顏色選擇器,圖片,尺寸值等。 (2)dp轉(zhuǎn)px,px轉(zhuǎn)dp public static int dp2px(int dp){ float density=getContext().getResourse().getDisplayMetrix().density;//獲取屏幕分辨率 return (int)(dp*density+0.5f); } public static?float px2dp(float px){ float density=getContext().getResourse().getDisplayMetrix().density;//獲取屏幕分辨率 return px/density; } (3)判斷是否位于主線程 public static boolean IsRunningMainThread(){ return getMainThreadId()==android.os.Process.myTid(); } (4)將線程拋到主線程中運(yùn)行 public static void RunningMainThread(Runnable r){ if(isRunningMainThread()){ r.run(); }else{ getHandler().post(r); } } (5)加載布局 3.接下來(lái)就是對(duì)于該項(xiàng)目整體框架的分析 上圖就是對(duì)于界面的整體分析,可以看到,界面大體框架就是如此,現(xiàn)在可以分析: (1)對(duì)于ActionBar,因?yàn)榇颂帢?biāo)題欄是使用android自帶的標(biāo)題欄,我們?cè)谥耙呀?jīng)導(dǎo)入v7-appcompat包,可以很好的兼容,同時(shí),我們創(chuàng)建一個(gè)BaseActivity繼承ActionBarActivity,作為此項(xiàng)目中所有活動(dòng)的基類,也就是所創(chuàng)建的所有活動(dòng)都要繼承BaseActivity,為了美觀,可以在AndroidManifest配置文件中的application設(shè)置主題為T(mén)heme.AppCompat.Light。這樣ActionBar就設(shè)置完成。 (2)對(duì)于PagerTab(指示器),我們可以自己寫(xiě)一個(gè)自定義控件,創(chuàng)建一個(gè)PagerTab類繼承ViewGroup,在其中設(shè)置相應(yīng)屬性,其中需要些兩個(gè)狀態(tài)選擇器,一個(gè)是每一個(gè)標(biāo)簽的背景按下與抬起是不一樣的,還有就是其中標(biāo)簽文字,選中、按下?tīng)顟B(tài)和未選中是不一樣的。在自定義控件寫(xiě)好之后,剩下的就是對(duì)其的調(diào)用。 (3)最麻煩的就是ViewPager的設(shè)置,我們知道,ViewPager中裝的是一個(gè)個(gè)頁(yè)面,也就是一個(gè)個(gè)View,怎樣將一個(gè)個(gè)View放入ViewPager中,是一個(gè)問(wèn)題。 我們換個(gè)角度來(lái)思考,每一個(gè)ViewPager都需要一個(gè)Adapter適配器,而viewpager的適配器有三類可以繼承,PagerAdapter,Adapter,FragmentPagerAdapter,一般我們都使用PagerAdapter,在其中實(shí)現(xiàn)四個(gè)未實(shí)現(xiàn)的方法(getCount(),instantiateItem(),isViewFromObject(),destroyItem()),這個(gè)方法確實(shí)可以,但是總感覺(jué)用起來(lái)非常麻煩,Adapter是父類,一般我們都會(huì)使用它的子類來(lái)繼承,那么,我們考慮一下FragmentPagerAdapter是否可以,我們知道FragmentPagerAdapter是PagerAdapter中的其中一種實(shí)現(xiàn)。它將每一個(gè)頁(yè)面表示為一個(gè)?Fragment,并且每一個(gè)Fragment都將會(huì)保存到fragment manager當(dāng)中。而且,當(dāng)用戶沒(méi)可能再次回到頁(yè)面的時(shí)候,fragment manager才會(huì)將這個(gè)Fragment銷毀。

這種pager十分適用于有一些靜態(tài)fragment,例如一組tabs,的時(shí)候使用。每個(gè)頁(yè)面對(duì)應(yīng)的Fragment當(dāng)用戶可以訪問(wèn)的時(shí)候會(huì)一直存在內(nèi)存中,但是,當(dāng)這個(gè)頁(yè)面不可見(jiàn)的時(shí)候,view hierarchy將會(huì)被銷毀。這樣子會(huì)導(dǎo)致應(yīng)用程序占有太多資源。當(dāng)頁(yè)面數(shù)量比較大的時(shí)候,建議使用?FragmentStatePagerAdapter。

當(dāng)使用FragmentPagerAdapter的時(shí)候,ViewPager一定要使用正確的ID set

FragmentPagerAdapter的子類只要實(shí)現(xiàn)?getItem(int)??getCount()方法。

由此我們可以認(rèn)定,在此種情況下,選用FragmentPagerAdapter是最好,那么問(wèn)題就來(lái)了,在getItem()方法中需要返回一個(gè)Fragment對(duì)象,而此處又有多個(gè)頁(yè)面,需要多個(gè)Fragment,該返回哪個(gè)fragment呢?

這里有幾個(gè)解決辦法,第一種就是使用HashMap將每個(gè)初始化后的Fragment對(duì)象存儲(chǔ)起來(lái),然后再通過(guò)hashmap.get(pos)得到相應(yīng)的Fragment;第二種就是使用工廠設(shè)計(jì)模式,生產(chǎn)出一個(gè)一個(gè)的Fragment。現(xiàn)在考慮這兩種方法的優(yōu)劣:

第一種方法需要在開(kāi)始時(shí)就要初始化所有的Fragment,但是我們想要的卻是當(dāng)ViewPager滑到哪一個(gè)頁(yè)面,哪一個(gè)Fragment才被初始化,這樣會(huì)大大節(jié)省內(nèi)存,而第二種方法就解決了這個(gè)問(wèn)題。

我們可以創(chuàng)建一個(gè)BaseFragment作為每一個(gè)頁(yè)面的基類,因?yàn)檫@幾個(gè)頁(yè)面有相似之處,可以在基類就顯示出(相似之處在后面會(huì)提到),在工廠類中可以根據(jù)ViewPager的位置來(lái)選擇初始化何種界面。

public class FragmentFactroy {private static HashMap<Integer,BaseFragment> hashMapfragment=new HashMap<Integer,BaseFragment>(); public static BaseFragment createFragment(int pos){BaseFragment baseFragment=hashMapfragment.get(pos); if (baseFragment==null){switch (pos){case 0:baseFragment=new HomeFragment(); break; case 1:baseFragment=new AppFragment(); break; case 2:baseFragment=new GameFragment(); break; case 3:baseFragment=new SubjectFragment(); break; case 4:baseFragment=new RecommendFragment(); break; case 5:baseFragment=new CategoryFragment(); break; case 6:baseFragment=new HotFragment(); break; default:break; }}hashMapfragment.put(pos,baseFragment); return baseFragment; }}

工廠類創(chuàng)建完成之后,在ViewPager適配器的getItem()方法中直接調(diào)用,BaseFragment fragment=FragmentFactroy.createFragment(pos);然后返回fragment就可以了。至此ViewPager的填充問(wèn)題就解決了。 由此,我們可以看出,此項(xiàng)目的大體框架就是使用Fragment填充ViewPager,在MainActivity中的布局文件中直接使用PagerTab和ViewPager來(lái)填充布局。

總結(jié)

以上是生活随笔為你收集整理的谷歌电子市场开发记录(2)-框架搭建的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。