【笔记】与Android选项卡一周
果然,還是項(xiàng)目驅(qū)動(dòng)的學(xué)習(xí)方式比較有趣呢。
這周的學(xué)習(xí)全部圍繞著選項(xiàng)卡,也就是tab。
用到了好多知識(shí)點(diǎn),都不知道從哪里開始啦(≧o≦*)。
????選項(xiàng)卡的制作有很多方法。選項(xiàng)菜單可以用普通的TextView,也可以直接上button。我選擇的是TextView,可能更接近網(wǎng)頁的思路吧。
先列個(gè)清單出來:
selector
Fragment
ViewPager
布局嘛,網(wǎng)上有一堆,就不提了。
1.selector
? ??選項(xiàng)卡的功能,就是按不同的按鈕就能切換到不同頁面。作為反饋,按鈕總得有點(diǎn)變化,比如換個(gè)顏色。實(shí)現(xiàn)思路很簡單,點(diǎn)擊之后換個(gè)圖標(biāo)就好了嘛。嗯~o(* ̄▽ ̄*)o,然而在onClick上折騰半天之后,我打開了百度,很快發(fā)現(xiàn)了selector這個(gè)標(biāo)簽。
Σヽ(Д ; )居然還有這種操作!
? ? ?selector用起來很簡單,寫在drawable目錄下:
for_tab1.xml:<selector xmlns:android="http://schemas.android.com/apk/res/android">
? ?<item android:drawable="@drawable/ic_news_act" android:state_selected="true" />
? ?<item android:drawable="@drawable/ic_news" />
</selector>
????ic_news和ic_news_act是通過new->Image Asset導(dǎo)入的圖標(biāo),自動(dòng)生成各種規(guī)格,免去了手動(dòng)處理圖片大小的麻煩。和.9圖應(yīng)該是一樣的效果吧(.9圖?我沒做,我不懂)。
????接著在主界面的TextView寫上這句話:
????android:drawableTop="@drawable/for_tab1"? ? 完工!
????改變item標(biāo)簽內(nèi)的屬性名(比如color),就可以改變其他效果。
2.Fragment
????接著就是內(nèi)容匹配。每個(gè)選項(xiàng)卡對(duì)應(yīng)一個(gè)內(nèi)容,一個(gè)內(nèi)容就是一個(gè)Fragment。
????android中一個(gè)頁面可以看作一個(gè)Activity,而Fragment只是”碎片“,生命周期不會(huì)長于所存在的Activity。查看配置文件AndroidManifest.xml可以發(fā)現(xiàn),Fragment是沒有注冊(cè)的。
?? ? 最簡單的Fragment,就是重寫onCreatView:
View?onCreateView(LayoutInflater?inflater,?ViewGroup?container,Bundle?savedInstanceState)?{View?view?=??inflater.inflate(R.layout.,?container,?);view;}
這時(shí)冒出了個(gè)inflater!你是誰?inflater說我只是個(gè)控制器,連接視圖和模型。啊~雖然沒有明白,但我暫時(shí)放過你,小心點(diǎn)inflater,我會(huì)盯著你的!
????
3.ViewPager
????鐺~鐺~鐺~
????ViewPager來了!快讓開!
????誒,Fragment好像沒講完啊?沒辦法呀,Fragment沒人(activity)權(quán)啊,只能靠主子(activity)接濟(jì)過活╮(╯3╰)╭。ViewPager就是從Activity派來的走狗,啊呸,使者!
? ?1) ViewPager可說是這個(gè)選項(xiàng)卡的核心。每個(gè)Fragment是選項(xiàng)卡顯示的內(nèi)容,ViewPager像是內(nèi)容的容器,同時(shí)擔(dān)任調(diào)度的工作。
????布局里的ViewPager看起來就是個(gè)普通的標(biāo)簽,但是人家上頭有人!
????ViewPager需要一個(gè)FragmentAdapter才能工作。
? ? 這是個(gè)超簡單的實(shí)現(xiàn):
tabFragmentAdapter?FragmentPagerAdapter?{ArrayList<Fragment>??;=;tabFragmentAdapter(FragmentManager?fm,?ArrayList<Fragment>?list){(fm);.=?list;}Fragment?getItem(position)?{.get(position);}getCount()?{;} }????入口在主界面的Java類中:
fg是填入了所有Fragment的ArrayList。
getSupperFragmentManager()取到了主界面的FragmentManager。
vp是用id獲取的布局中的ViewPager。
在tab所在的主界面的Java類的onCreate()中運(yùn)行,就綁定好了這些Fragment。
2)Listener人呢?給tab們綁定好事件就該你上場了
tabListener?View.OnClickListener?{=?;tabListener(index)?{.=?index;}onClick(View?v)?{.setCurrentItem();clearSelect();.get().setSelected();} }index是區(qū)分tab的編號(hào);
clearSelect是將tab卡片選擇狀態(tài)重置(用setSelected(false));
tabList里裝的是作為tab按鈕的TextView;
綁定事件應(yīng)該會(huì),,,吧?
(i?=?;?i?<?.size();?i++)?{.get(i).setOnClickListener(tabListener(i)); }似乎很簡單,但是我不會(huì)告訴你,有一半時(shí)間花在了調(diào)空指針的BUG!
轉(zhuǎn)載于:https://blog.51cto.com/gzq2017/1927812
總結(jié)
以上是生活随笔為你收集整理的【笔记】与Android选项卡一周的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 配置虚拟主机 和 打war包
- 下一篇: SprintBoot中如何构造Bean原