生活随笔
收集整理的這篇文章主要介紹了
谷歌电子市场开发记录(2)-框架搭建
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
上一篇博客說了開發前的準備工作,現在就要開始正式開發了。
在項目開發時,難免需要使用到常用的一些對象,比如說Context上下文,經常需要使用,因此,此處,可以新建一個全局的Application,將常用的一些對象先new好,以便以后直接調用。
1.新建一個GlobalApplication類,繼承Application,實現OnCreate()方法,在這個類中,需要初始化三個對象。
(1)Context mContext=getApplicationContext();上下文經常需要使用使用,因此,在此處先得到。
(2)Handler mHandler=new Handler();Handler對象在處理多線程,消息隊列時需要經常使用,此項目需要處理多線程下載,Handler更顯得至關重要。
(3)int MainThreadId=android.os.Process.myTid();獲得主線程Id,因為要處理多線程,而處理UI時,必須在主線程處理,因此,需要得到主線程Id,從而判斷某個處理是否運行在主線程
在初始化之后,提取作為全局成員,并得到get()方法。
2.為了處理UI中的一些邏輯,將一些必用的方法封裝為一個工具類。新建一個工具類UIUtils,在這個類中,封裝很多方法。
(1)根據id得到字符串,字符串數組,顏色值,顏色選擇器,圖片,尺寸值等。
(2)dp轉px,px轉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)將線程拋到主線程中運行 public static void RunningMainThread(Runnable r){ if(isRunningMainThread()){ r.run(); }else{ getHandler().post(r); } } (5)加載布局 3.接下來就是對于該項目整體框架的分析 上圖就是對于界面的整體分析,可以看到,界面大體框架就是如此,現在可以分析: (1)對于ActionBar,因為此處標題欄是使用android自帶的標題欄,我們在之前已經導入v7-appcompat包,可以很好的兼容,同時,我們創建一個BaseActivity繼承ActionBarActivity,作為此項目中所有活動的基類,也就是所創建的所有活動都要繼承BaseActivity,為了美觀,可以在AndroidManifest配置文件中的application設置主題為Theme.AppCompat.Light。這樣ActionBar就設置完成。 (2)對于PagerTab(指示器),我們可以自己寫一個自定義控件,創建一個PagerTab類繼承ViewGroup,在其中設置相應屬性,其中需要些兩個狀態選擇器,一個是每一個標簽的背景按下與抬起是不一樣的,還有就是其中標簽文字,選中、按下狀態和未選中是不一樣的。在自定義控件寫好之后,剩下的就是對其的調用。 (3)最麻煩的就是ViewPager的設置,我們知道,ViewPager中裝的是一個個頁面,也就是一個個View,怎樣將一個個View放入ViewPager中,是一個問題。 我們換個角度來思考,每一個ViewPager都需要一個Adapter適配器,而viewpager的適配器有三類可以繼承,PagerAdapter,Adapter,FragmentPagerAdapter,一般我們都使用PagerAdapter,在其中實現四個未實現的方法(getCount(),instantiateItem(),isViewFromObject(),destroyItem()),這個方法確實可以,但是總感覺用起來非常麻煩,Adapter是父類,一般我們都會使用它的子類來繼承,那么,我們考慮一下FragmentPagerAdapter是否可以,我們知道FragmentPagerAdapter是
PagerAdapter中的其中一種實現。它將每一個頁面表示為一個
?Fragment,并且每一個Fragment都將會保存到fragment manager當中。而且,當用戶沒可能再次回到頁面的時候,fragment manager才會將這個Fragment銷毀。
這種pager十分適用于有一些靜態fragment,例如一組tabs,的時候使用。每個頁面對應的Fragment當用戶可以訪問的時候會一直存在內存中,但是,當這個頁面不可見的時候,view hierarchy將會被銷毀。這樣子會導致應用程序占有太多資源。當頁面數量比較大的時候,建議使用?FragmentStatePagerAdapter。
當使用FragmentPagerAdapter的時候,ViewPager一定要使用正確的ID set。
FragmentPagerAdapter的子類只要實現?getItem(int)?和?getCount()方法。
由此我們可以認定,在此種情況下,選用FragmentPagerAdapter是最好,那么問題就來了,在getItem()方法中需要返回一個Fragment對象,而此處又有多個頁面,需要多個Fragment,該返回哪個fragment呢?
這里有幾個解決辦法,第一種就是使用HashMap將每個初始化后的Fragment對象存儲起來,然后再通過hashmap.get(pos)得到相應的Fragment;第二種就是使用工廠設計模式,生產出一個一個的Fragment。現在考慮這兩種方法的優劣:
第一種方法需要在開始時就要初始化所有的Fragment,但是我們想要的卻是當ViewPager滑到哪一個頁面,哪一個Fragment才被初始化,這樣會大大節省內存,而第二種方法就解決了這個問題。
我們可以創建一個BaseFragment作為每一個頁面的基類,因為這幾個頁面有相似之處,可以在基類就顯示出(相似之處在后面會提到),在工廠類中可以根據ViewPager的位置來選擇初始化何種界面。
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
;
}}
工廠類創建完成之后,在ViewPager適配器的getItem()方法中直接調用,BaseFragment fragment=FragmentFactroy.createFragment(pos);然后返回fragment就可以了。至此ViewPager的填充問題就解決了。 由此,我們可以看出,此項目的大體框架就是使用Fragment填充ViewPager,在MainActivity中的布局文件中直接使用PagerTab和ViewPager來填充布局。
總結
以上是生活随笔為你收集整理的谷歌电子市场开发记录(2)-框架搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。