1. 什么是碎片
在我理解看來,碎片可以看做活動(dòng)UI的一部分或者一種行為。這句話好繞口,但是換個(gè)方式理解起來可能就簡單了,可以看做是子活動(dòng)(sub Activity),有自己的界面逐工,有自己的生命周期,有自己的事件一睁。碎片也可以看做是Activity的模塊钻弄,可以在Activity里添加或者刪除或者替換碎片。
2. 碎片的使用方式
碎片的簡單使用方式:
-
fragment
的布局文件<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical"> <Button android:id="@+id/button" android:text="Button" android:layout_gravity="center_horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
-
MyFragment
類繼承自Fragment
類者吁,重寫onCreatView()
方法public class LeftFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ View view = inflater.inflate(R.layout.left_fragment,container窘俺,false); return view; } }
-
在
Activity
的布局文件中添加<fragment>
控件<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="horizontal"> <fragment android:id="@+id/left_fragment" android:name="com.example.lcp.fragmenttest.LeftFragment" android:layout_width="0dp" android:layout_weight="1" android:layout_height="match_parent" /> <fragment android:id="@+id/right_fragment" android:name="com.example.lcp.fragmenttest.RightFragment" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout>
效果
動(dòng)態(tài)添加碎片
利用
framelayout
來動(dòng)態(tài)添加碎片
//1.創(chuàng)建碎片實(shí)例
AnotherFragment anotherFragment = new AnotherFragment();
//2.通過getFragmentManager()方法獲取FragmentManager實(shí)例
FragmentManager manager = getFragmentManager();
//3.調(diào)用FragmentManager的beginTransaction()方法開啟碎片事務(wù)
FragmentTransaction transaction = manager.beginTransaction();
//4.調(diào)用transaction的replace()方法,第一個(gè)參數(shù)是framelayout容器,第二個(gè)參數(shù)是碎片實(shí)例
transaction.replace(R.id.right_layout,anotherFragment);
//5.提交事務(wù)
transaction.commit();
效果:(錄屏錄得時(shí)間沒把握好复凳。瘤泪。閃起來了)
碎片的返回棧
在碎片被替換后如果我們按Back鍵,那么程序?qū)⑼顺鲇恕D敲慈绻敕祷氐缴弦粋€(gè)碎片又該怎么做呢对途?
/*調(diào)用transaction的addToBackStack()方法,
*參數(shù)是一個(gè)string,用來描述返回棧的狀態(tài)髓棋,一般為null*/
transaction.addToBackStack(null);
碎片和活動(dòng)之間通信
碎片可以訪問活動(dòng)實(shí)例
View listView = getActivity().findViewById(R.id.list);
活動(dòng)可以獲取碎片實(shí)例
ExampleFragment fragment = (ExampleFragment)
getFragmentManager().findFragmentById(R.id.example_fragment);
3. 碎片的生命周期
貼圖:
碎片的狀態(tài)
碎片的狀態(tài)與活動(dòng)的狀態(tài)息息相關(guān)
- 運(yùn)行狀態(tài):當(dāng)一個(gè)碎片是可見的实檀,并且與它關(guān)聯(lián)的活動(dòng)正處于運(yùn)行狀態(tài)時(shí),該碎片也處于運(yùn)行狀態(tài)按声。
- 暫停狀態(tài):另一個(gè)活動(dòng)在前臺(tái)膳犹,而且與碎片相關(guān)聯(lián)的活動(dòng)還可見,該活動(dòng)與碎片都處于暫停狀態(tài)签则。
- 停止?fàn)顟B(tài):直白講就是碎片不可見须床。有兩種方式,一種是活動(dòng)進(jìn)入停止?fàn)顟B(tài)渐裂,碎片自然隨之停止豺旬。另一種是因?yàn)檎{(diào)用了
FragmentTransaction
的remove()
方法或者replace()
方法時(shí)钠惩,而且被加入返回棧了。- 銷毀狀態(tài):也是兩種方式:一種是活動(dòng)被銷毀了族阅,碎片也隨之銷毀篓跛。另一種是因?yàn)檎{(diào)用了
FragmentTransaction
的remove()
方法或者replace()
方法后,沒有被加入返回棧耘分。
![The effect of the activity lifecycle on the fragment lifecycle.](http://developer.android.com/images/activity_fragment_lifecycle.png)
碎片獨(dú)有的回調(diào)方法
onAttach()
:當(dāng)碎片和活動(dòng)建立關(guān)聯(lián)的時(shí)候調(diào)用举塔,Activity這個(gè)時(shí)候傳遞進(jìn)來。onCreateView()
:為碎片加載布局的時(shí)候調(diào)用onActivityCreated()
:當(dāng)接收到Activity
的onCreate()
的返回值時(shí)調(diào)用onDestroyView()
:當(dāng)與碎片關(guān)聯(lián)的視圖被移除的時(shí)候調(diào)用求泰。onDetach()
:當(dāng)碎片和活動(dòng)解除關(guān)聯(lián)的時(shí)候調(diào)用。
4. 動(dòng)態(tài)加載布局的技巧
如何讓程序根據(jù)實(shí)際運(yùn)行設(shè)備的屏幕來決定加載哪個(gè)布局呢计盒?應(yīng)該有多個(gè)布局文件讓程序去選擇渴频,但是又怎么去決定加載哪個(gè)呢?
使用限定符
在res目錄下新建有限定符的layout文件夾北启,在這個(gè)文件夾下建立布局文件卜朗,這樣加載布局的時(shí)候就會(huì)根據(jù)屏幕大小或者分辨率或者屏幕方向來決定加載的布局了!這里給出一些限定符的可選值吧咕村,替換那個(gè)large就是了场钉。
屏幕大小:small,normal,large,xlarge.
分辨率:ldpi,mdpi,hdpi,xhdpi.
方向:land,port
最小寬度限定符
我們可以固定的數(shù)值來替代限定符
建立layout-sw600dp文件夾懈涛,代表著屏幕寬度大于600dp的時(shí)候會(huì)加載這個(gè)文件夾的布局文件逛万。sw 代表 smallest width.
5. 總結(jié)
這次不把實(shí)踐寫里面了,有種湊字?jǐn)?shù)的嫌疑批钠。宇植。。初心是記錄每章的基本知識(shí)埋心,望不忘初心指郁。
合抱之木,生于毫末拷呆;九層之臺(tái)闲坎,起于壘土;千里之行茬斧,始于足下腰懂。
本章的內(nèi)容起于碎片的存在需求,包含了碎片的基本使用方法啥供,對(duì)于碎片生命周期里的具體每一環(huán)還有很多細(xì)節(jié)要搞清楚悯恍,然后就是對(duì)于屏幕適配方面的一些基本內(nèi)容了。
關(guān)于Android的平板伙狐,真正為平板適配的應(yīng)用太少涮毫。但是話說回來瞬欧,用Android平板的也不多。哈哈罢防。睡覺艘虎!