版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、項目說明 2、項目 MainActivity代碼Fragment生命周 3、系統(tǒng)主界面 4、菜 Fragment布 4.2Fragment代 5、項目 Android智慧-03業(yè)務(wù)邏輯的實1、項目說明publicclassMainActivityextendsSlidingFragmentActivityprivate;publicvoidonCreate(BundlesavedInstanceState)寫了這么多篇文檔,這一篇是本publicclassMainActivityextendsSlidingFragmentActivityprivate;publicvoidonCreate(BundlesavedInstanceState)中項目結(jié)構(gòu)的形式來展示代碼的實現(xiàn)。在代碼中加入近乎比代碼本身還多的注釋在上一篇文章中,把智慧的整體框架給搭建起來了,在這一篇我將把智慧的所有代碼展示出來,由于這個項目不像衛(wèi)士那樣,按照一個功能模塊一個功能模塊的講解,而是先搭建整體框架,然后在框架中填充代碼2、項 MainActivity代MainActivity中生成了兩個Fragment,一個是代表主頁面的HomeFragment,另外一個是代表菜單的給Sliding FrameLayout這個控件生來命就苦,
= 給 設(shè)置Sliding dimens.xml中的對應(yīng)值為:<dimen 給Sliding 色,一般都是漸變的色彩,這里設(shè)置背景也是需要在xml文件中設(shè)置 <?xmlversion="1.0"encoding="utf- /apk/res/android"<gradientandroid:centerColor="#2D000000"android:startColor="#00000000" <dimen 給 因為Sliding 將 Fragment=new Fragment, HomeFragmenthomeFragment=newHomeFragment();homeFragment,}中的Fragment Fragment enuFragment()return Fragment) }publicHomeFragmentswitchHomeFragment()return(HomeFragment)ActivityActivityFragment在Activity中的。那么Fragment的生命周期是什么呢?Fragment生命周Fragment的生命周期,我在Android基礎(chǔ)文檔中已經(jīng)詳細(xì)介紹過,能夠看到這里的也應(yīng)該是基礎(chǔ)和耐心都比較OK的吧,因此為了節(jié)約時間同時幫大家復(fù)習(xí)Fragment生命周期知識,我把Fragment生命周期的流程圖貼出FragmentActivityActivityFragment從上面可以看出來Fragment的生命周期要比Activity多,可以這么理解。其實所謂的“生命周期”只是用系統(tǒng)的回調(diào)函數(shù)來代替罷了。上面的那些方法都是Activity或者Fragment狀態(tài)改變時的回調(diào)過程,是一個切換到該Fragment屏幕滅掉屏幕切換到其他Fragment切換回本身的Fragment回到桌面回到應(yīng)用退出應(yīng)用3、系統(tǒng)主界 在MainActivity中用到了兩個Fragment,這是已知的使用量。在真實項目的不斷更新過程中,可能有 碼重用度也增加了代碼的可移植性基于上面的考慮,抽取了BaseFragment,該類作為該項目中其他Fragment的父類Fragment基類 classBaseFragmentextendsFragmentpublicViewpublicContextpublic;publicvoidonCreate(BundlesavedInstanceState) context= classBaseFragmentextendsFragmentpublicViewpublicContextpublic;publicvoidonCreate(BundlesavedInstanceState) context= 的 = }publicViewonCreateView(LayoutInflaterinflater,ViewGroupBundleBundlesavedInstanceState)view=return}publicvoidonActivityCreated(BundlesavedInstanceState) } voidinitData(Bundle ViewinitView(LayoutInflater}<?xmlversion<?xmlversion="1.0"encoding="utf-<LinearLayoutxmlns:android="http://sandroid:orientation="vertical",ger ger-- android:layout_weight="1.0"該類繼承自BaseFragment。該類主要用于顯示內(nèi)容的主界面,這里有必須要將該類用到的布局 如下<!--在RadoGroup中放置了多個RadioButton,點擊RadioButton觸發(fā)的效果就是切換 面自定義的Vie android:paddingTop="2dp">android:text="@string/tab_function"/>android:text="@string/tab_news_center"/>android:text="@string/tab_smart_service"/> _affairs"/>android:text="@string/tab_setting"/> publicclassHomeFragmentextends publicclassHomeFragmentextends{publicstaticfinalStringtag="HomeFragment";private private publicViewinitView(LayoutInflaterinflater)view=inflater.inflate(R.layout.frag_home,HomeFragment代通過將view注入給ViewUti,然后 然后反射findViewByID()方法,將生成的對象 反射給該類的屬性,OK了, ViewUtils.inject(this,return} 給 publicvoidinitData(BundlesavedInstanceState)//RadioGroup總得有個默認(rèn)選中項吧,那好, pagersList=newpagersList.add(newFuctionPager(getActivity()));//首頁pagersList.add(newNewsCenterPager(getActivity()));// pagersList.add(newSmartServicePager(getActivity()));//智慧服務(wù) pagersList.add(newSettingPager(getActivity()));//設(shè)置給 gerlayout_content.setAdapter(new給 ger對象 gerlayout_content設(shè)置頁面更 事件,就是 {publicvoidonPageSelected(intposition)BasePagerbasePager=pagersList.get(position);}publicvoidonPageScrolled(intposition,floatpositionOffset,positionOffsetPixels)//TODOAuto-generatedmethod}publicvoidonPageScrollStateChanged(intstate)//TODOAuto-generatedmethod} radioGroup.setOnCheckedChangeListener(new{publicvoidonCheckedChanged(RadioGroupgroup,intcheckedId) switch(checkedId)case case case case case }} BasePagerbasePager=pagersList.get(0);} classMyAdapterextends{publicintgetCount()return}publicbooleanisViewFromObject(Viewarg0,Objectarg1)returnarg0==} publicObjectinstantiateItem(ViewGroupcontainer,int{ return}publicvoiddestroyItem(ViewGroupcontainer,intposition,Object{ ger)container).removeView((View)}}}publicNewsCenterPagerswitchNewCenterPager()return(NewsCenterPager)}}publicclassNewsCenterPagerpublicclassNewsCenterPagerextendsBasePagerprotectedstaticfinalStringtag= privateNewCenterpublicFrameLayoutnews_center_fl; 這么多pager呢,因為 個FameLayout,從布局文件中也知道。并不提供真正的內(nèi)容 ist<BasePager> title的布局已經(jīng)抽取出來其他tab中的選項也可以用跟這個布局文件,從當(dāng)前類用到的布局文件中引入的布局 ist<String>在HomeFragment中的MyVie ger每一頁都是一個Pager, 設(shè)置等是MyVie ger的5個Pager,因為 項目主要完成 中心,因此這里給出 中心對應(yīng)的NewsCenterPager類的實現(xiàn)。publicNewsCenterPager(Contextcontext)}publicViewinitView()view=View.inflate(context,R.layout.news_center_frame,returnview;}publicvoidinitData()
* *xml Stringresult=SharedPreferencesUtil.getStringD HMApi.NEWS_CENTER_CATEGORIES,"");}else}}privatevoidgetNewCenterData()getdata(HttpMethod.GET,HMApi.NEWS_CENTER_CATEGORIES,null, {publicvoidonSuccess(ResponseInfo<String>responseInfo) HMApi.NEWS_CENTER_CATEGORIES,responseInfo.result);}publicvoidonFailure(HttpExceptionerror,Stringmsg)}}privatevoidprocessData(Stringresult) 中心數(shù)據(jù)轉(zhuǎn)化為NewCenternewCenter=GsonUtil.jsonToBean(result,NewCenter.class);titleList=newArrayList<String>();for(inti=0;}//當(dāng)前titleList是封裝了左側(cè)側(cè)拉條目的數(shù)據(jù),需要傳遞給 Fragment對應(yīng)對象 大家可能已經(jīng)暈了,不知道下面的四個Pager是哪些,這些Pager是當(dāng) 這個RadioButton的時候 pagers=new class{publicContextpublicViewpublic publicTextViewprivateImageButtonimgbtn_text;privateImageButtonimgbtn_right;privateImageButtonbtn_right;publicBasePager(Contextcontext)this.context=pagers.add(pagers.add(newNe pagers.add(newPicPager(context,newCenter.data.get(2)));pagers.add(newIntPager(context,newCenter.data.get(3))); }publicvoidswitchPager(inti) BasePagerbasePager=pagers.get(i);}} =((MainActivity)context).getSliding view=initView();} publicViewreturn}publicvoidButtonbtn_left=(Button)view.findViewById(R.id.btn_left);ImageButtonimgbtn_left=(ImageButton) imgbtn_left.setOnClickListener(newOnClickListener()publicvoidonClick(Viewv) } txt_title=(TextView)view.findViewById(R.id.txt_title);imgbtn_text=(ImageButton)view.findViewById(R.id.imgbtn_text);imgbtn_right=(ImageButton)view.findViewById(R.id.imgbtn_right);btn_right=(ImageButton)view.findViewById(R.id.btn_right);} View voidpublicvoidgetdata(HttpMethodhttpMethod,Stringurl,RequestParams allBack<String>callBack){HttpUtilshttpUtils=newHttpUtils();}}NewCenter是根據(jù)Json格式的數(shù)據(jù)封裝的JavaBean。這里面的所有屬性都是public的,感覺不符合java的封裝的特性,但是這樣的做法無可厚非,因為這個對象只是作為臨時數(shù)據(jù)的,或者說是序列化數(shù)據(jù)轉(zhuǎn)化成內(nèi)存對象的載體,因此怎么方便就怎么來了,而且的嵌套層次比較深,如果寫setter、getter也是很麻煩。沒有最好的設(shè)計思想,只有最好的應(yīng)用場景,對于這種設(shè)計從了吧。publicpublicclassNewCenterpublicList<NewCenterItem>data;publicList<String>extend;publicStringretcode;publicclasspublicList<Children>publicStringid;publicStringtitle;publicStringtype;publicStringurl;publicStringurl1;publicStringdayurl;publicStringexcurl;publicStringweekurl;}publicclasspublicStringpublicpublicStringtitle;publicStringtype;publicStringurl;}}.5 ger 主界面主線上的一個頁面,就中心(tab菜單 gerger布局有必要展示出來,這個布局里用到了導(dǎo)航條,很遺憾(或者說慶幸)是上的開源代碼把這個類拿出來放的工程中自己用了。因此這個類就不示了,在文檔的最后我會附上整個地址,大下來項目就行,項目里面啥都有。導(dǎo)航條如下所示publicclassGsonUtilpublicstatic<T>TjsonToBean(Stringjson,Class<T>clazz){Gsongson=newGson();returngson.fromJson(json,}} ger用到的布局文件為frag_news.xml,如下<?xmlversion="1.0"encoding="utf-<LinearLayoutxmlns:android="http://s android:orientation="horizontal"> ger的顯示,一一對應(yīng)(1,1)-- android:paddingBottom="2dp" android:layout_weight="1"/>:上面布局文件中的TabPageIndicator其實就 上的 gerIndicator,只不過是改了個名字Neger代publicclass gerextendsBasePagerprivateNewCenterItem這個導(dǎo)航欄在下面的代碼中關(guān)聯(lián)上了Vie ger,導(dǎo)航欄的一個子條目就對應(yīng)Vie privateTabPageIndicatorindicator;private ger 因為每個導(dǎo)航欄的子條目都對應(yīng)一個Vie ger中的一個頁面,因此 ist<BasePager>pagerList=new ist<String>titleList=new privateMyAdapterpublic ger(Contextcontext,NewCenterItemcenterItem)this.newCenterItem=centerItem;}publicViewinitView()view=View.inflate(context,R.layout.frag_news,null);return}publicvoidinitData()//底部vie 裝在centerItem對應(yīng)children節(jié)點中url所指向的地址for(int//根據(jù)傳遞進(jìn)來的數(shù)據(jù)創(chuàng)建pager,這個pager就是需要展示出來的,也是 } if(myAdapternull){myAdapter= } 給 就可以抽出Sliding 一個則不能抽出Sliding ger.setOnPageChangeListener(newOnPageChangeListener()publicvoidonPageSelected(intarg0)if(arg00){ }BasePagerbasePager=pagerList.get(arg0);}publicvoidonPageScrolled(intarg0,floatarg1,intarg2)//TODOAuto-generatedmethod}publicvoidonPageScrollStateChanged(intarg0)//TODOAuto-generatedmethod}BasePagerbasePager=pagerList.get(0);}classMyAdapterPagerAdapter{publicCharSequencegetPageTitle(intposition)return}publicintgetCount()return}publicbooleanisViewFromObject(Viewarg0,Objectarg1)returnarg0==}publicObjectinstantiateItem(ViewGroupcontainer,int{ return}publicvoiddestroyItem(ViewGroupcontainer,intposition,Object{ }}}在Ne 個ListView,不過加上了下拉刷新和上拉加載數(shù)據(jù),用到了 上又一開源框架<?xmlversion="1.0"encoding="utf-><!--放置輪 位置-- <?xmlversion="1.0"encoding="utf-><!--放置輪 位置-- android:orientation="horizontal"/>android:orientation="horizontal"><!--放 標(biāo)題的位置-- <!--放 中選中點的位置--布局文件 如下<?<?xmlversion="1.0"encoding="utf-<FrameLayoutxmlns:android="http://s android:background="@color/white">android:scrollbars="none"/> 現(xiàn)實頁面最直接的類,也是最復(fù)雜的類。之前嵌套了那么多,這個類才是真正干活的NewItemPager代 * publicclassNewItemPagerextendsBasePagerprivateStringprivateView ist<String>titleList=new ist<String>urlImgList=new ist<View>viewList=new inearLayout privateTextView inearLayout自定義 privatePullToRefreshListViewprivateMyBaseAdapterprivateString ist<News>newList=newArrayList<News>(); ist<String>idList=newArrayList<String>();protectedstaticfinalStringIDS="ids";publicNewItemPager(Contextcontext,Stringurl)this.url=}publicViewinitView()layout_roll_view=View.inflate(context,R.layout.layout_roll_view,null);ViewUtils.inject(this,layout_roll_view); ger=(LinearLayout) view=View.inflate(context,R.layout.frag_item_news,null);ViewUtils.inject(this,view);ptrlv=(PullToRefreshListView) ptrlv.setOnRefreshListener(newOnRefreshListener<ListView>()getNewItemPager(url,}publicvoidonPullUpToRefresh(PullToRefreshBase<ListView>refreshView)getNewItemPager(moreUrl,} ptrlv.getRefreshableView().setOnItemClickListener(new{{//如果已經(jīng)是度過 if(!newList.get(arg2-1).isRead)*newList.get(arg2-1).isRead= 的 Stringids=SharedPreferencesUtil.getStringD ontext,IDS,""); ontext,IDS,ids+"#"+newList.get(arg2-} Intentintent=newIntent(context,NewsDetailActivity.class);intent.putExtra("url",newList.get(arg2-1).url);}return}publicvoidinitData()//現(xiàn) 讀,將服務(wù)端返回數(shù)據(jù)NewsisRead字段設(shè)置成true,falseStringids= ontext,IDS,String[]strings=for(inti=0;i<strings.length;{}Stringresult=SharedPreferencesUtil.getStringD url,"");if{processData(result,getNewItemPager(url,}}privatevoidgetNewItemPager(finalStringurl,finalbooleanisRefresh)if(!TextUtils.isEmpty(url))getdata(HttpMethod.GET,HMApi.BASE_URL+url,null, allBack<String>()publicvoidonSuccess(ResponseInfo<String>{SharedPreferencesUtil.saveStringD processData(responseInfo.result,}publicvoidonFailure(HttpExceptionerror,Stringmsg)}}elseToast.makeText(context,"沒 數(shù)據(jù)",// }}privatevoidprocessData(Stringresult,boolean{NewBeanbean=GsonUtil.jsonToBean(result,if(bean.retcode.equals("200"))moreUrl= 數(shù)據(jù)大于if(bean.data.topnews.size()>0)iffor(inti=0;i<bean.data.topnews.size();{titleList.add(bean.data.topnews.get(i).title);} gerrollVie ger=newRollVie viewList,new ger.onPageClick()publicvoidonclick(inti)Toast.makeText(context,"position="+i,} ger.initTitleList(top_news_title,titleList); //if(ptrlv.getRefreshableView().getHeaderViewsCount()<{}}}if(bean.data.news.size()>0)if(isRefresh)}*遍 for(inti=0;i<newList.size();i++)if{newList.get(i).isRead=}elsenewList.get(i).isRead=}}if(myBaseAdapter==null)myBaseAdapter=newMyBaseAdapter(context,newList);}else}}// }}classMyBaseAdapterextendsHMAdapter<News>publicMyBaseAdapter(Contextcontext,List<News>list)super(context,}publicViewgetView(intposition,ViewconvertView,ViewGroupparent)if(convertView==null)convertView=View.inflate(context,R.layout.layout_news_item,} BitmapUtilsbitmapUtils=new ImageViewiv_img=(ImageView)convertView.findViewById(R.id.iv_img);TextViewtv_title=(TextView)convertView.findViewById(R.id.tv_title);TextViewtv_pub_date=(TextView)bitmapUtils.display(iv_img,list.get(position).listimage); if(list.get(position).isRead)}else}return}}*privatevoidfor(inti=0;i<urlImgList.size();{Viewview=newif(i=={}else} LinearLayout.LayoutParams(CommonUtil.dip2px(context,CommonUtil.CommonUtil.dip2px(context,layoutParams.setMargins(5,0,5,0);}}}在上面的代碼 具體對象封裝在 中,其代碼如下所示packagepackageimportpublicclass{publicNewBeanItemdata;publicStringpublicclasspublic publicStringpublicStringpublicList<News>news;publicList<Topic>topic;publicList<Topnews>topnews;}publicclasspublicStringcomment;publicStringcommentlist;publicStringcommenturl; publicString publicStringRollVie在NewItemPager類中用到了自定義額的 ger,其代碼如下publicclass gerextends gerprivateContext* ist<View>*頂部標(biāo)題(中國背景社會等等privateTextView* ist<String>*輪播 ist<String>privateBitmapUtils* privateMyAdapterprivateRunnableTaskprivateintcurrentPosition=privateHandlerhandler=newpublicvoidhandleMessage(android.os.Messagemsg) classRunnableTaskimplementsRunnable{@Overridepublicvoidrun(){ currentPosition=(currentPosition+1)%viewList.size(); }}privateintprivateint privateOnPageClick publicbooleandispatchTouchEvent(MotionEventev)switch(ev.getAction())case ger對應(yīng)的控件不要 事 downX=(int)ev.getX();downY=(int)caseMotionEvent.ACTION_MOVE:intmoveX=(int)ev.getX();intmoveY= downX)){ }}returnprotectedvoidonDetachedFromWindow()}publicRollVie ger(Contextcontext,finalList<View>viewList,OnPageClickpageClick){//newRollVie this.context=context;this.viewList=viewList;this.pageClick=pageClick;bitmapUtils=newBitmapUtils(context);runnableTask=newRunnableTask();this.setOnPageChangeListener(new{publicvoidonPageSelected(intarg0){for(inti=0;i<urlImgList.size();i++){}}}publicvoidonPageScrolled(intarg0,floatarg1,intarg2)//TODOAuto-generatedmethod}publicvoidonPageScrollStateChanged(intarg0)//TODOAuto-generatedmethod}} publicvoidinitTitleList(TextViewtop_news_title,List<String>titleList)if(null!=top_news_title&&null!=titleList&&}this.top_news_title=this.titleList=} publicvoidinitImgUrlList(List<String>urlImgList)this.urlImgList=}publicinterface voidonclick(int}publicvoidstartRoll() if(myAdapternull){myAdapter=newthis.setAdapter(myAdapter);}handler.postDelayed(runnableTask,}classMyAdapterextendsPagerAdapter{@OverridepublicintgetCount()return}publicbooleanisViewFromObject(Viewarg0,Objectarg1)returnarg0==}publicObjectinstantiateItem(ViewGroupcontainer,finalint{Viewview=View.inflate(context,R.layout.vie ger_item,null);ImageViewimageView=(ImageView)view.findViewById(R.id.image);view.setOnTouchListener(newOnTouchListener()privateint ong
publicbooleanonTouch(Viewv,MotionEventevent)switch(event.getAction())case downX=(int)downTime=caseif(System.currentTimeMillis()-downTime<500&&downX
}}}return}return}publicvoiddestroyItem(ViewGroupcontainer,intposition,Object{}}} MyVieger類很簡單只是單純的繼承了父類LazyVieger,同時覆寫了父類的事件分發(fā)器方法,在該方法中返回false,這樣保證了Vieger不子控件的觸摸事件。如果onInterceptTouchEvent返回true會是什么效果呢?如果返回true那么在子控件上的滑動事件被父控件也就是的Vieger給了,并且該事件發(fā)生在了自己身上,那么的Vieger就切換頁面了,而根據(jù)的邏輯這里的Vieger中的每一個頁面代表一個一級菜單底部的tab內(nèi)容,不應(yīng)該換頁。 publicclass gerextends gerpublic ger(Contextcontext,AttributeSetattrs)super(context,}public ger(Contextcontext)}publicbooleanonInterceptTouchEvent(MotionEventev)return}publicbooleanonTouchEvent(MotionEventev)return}} 這里用到的LazyVieger 上的一個開源框架,直接把源碼放到的代碼中進(jìn)行使用,這還能對其進(jìn)行修改。知
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 雅安市高2022級(2025屆)高三“零診”考試 語文試卷(含標(biāo)準(zhǔn)答案)
- 養(yǎng)老護(hù)理員初級培訓(xùn)
- 中考數(shù)學(xué)二輪復(fù)習(xí)專項選擇題題組集訓(xùn)二課件
- 防疫培訓(xùn)幼兒園
- 2024-2025學(xué)年貴州省六盤水市水城區(qū)高二上學(xué)期期中質(zhì)量監(jiān)測數(shù)學(xué)試卷(含答案)
- T-ZFDSA 20-2024 蜂蜜蒸梨制作標(biāo)準(zhǔn)
- 山東省菏澤市鄆城一中2024-2025學(xué)年九年級上學(xué)期第一次月考數(shù)學(xué)試題
- 03Z028安全環(huán)保部安全管理員工作標(biāo)準(zhǔn)
- 人教版六年級語文下冊兩小兒辯日
- 高中語文第5單元散而不亂氣脈中貫3祭十二郞文課件新人教版選修中國古代詩歌散文欣賞
- YS/T 73-2011副產(chǎn)品氧化鋅
- GB/T 23858-2009檢查井蓋
- 工傷職工停工留薪期目錄
- 2023年博雅學(xué)校雅思閱讀模擬題及答案三ver.5
- 2高鐵AB料路基填筑施工技術(shù)
- T-NTRPTA 0030-2020 無人機(jī)精準(zhǔn)測繪技術(shù)規(guī)范
- 漏(中國民間故事)
- 工程制圖與CAD2021年春學(xué)期期末考試試卷
- 骨科護(hù)理查房骨牽引病人護(hù)理實用課件
- 運(yùn)動損傷的預(yù)防和處理 醫(yī)學(xué)知識講座
- 《新能源汽車故障診斷和維修研究(論文)8200字》
評論
0/150
提交評論