作為大多數剛接觸Android應用開發的人來說,在一個強大的Activity類中,就可以完成豐富多彩的UI工作,但是雜亂的螢幕分辨率,使得本來好不容易寫好的UI,變得不堪入目。。。該怎麼辦那?

一.Fragment介紹:
<a href="http://blog.51cto.com/attachment/201310/122535110.png" target="_blank"></a>
Fragment是我們在單個Activity上要切換多個UI界面時,要顯示的不同内容。子產品化這些UI面闆可以提供給其他Acitivity來使用,是以我們可以簡單地把Fragment看成類似于TextView控件一樣,可以被任意的Activity進行加載。
1.靜态加載:
首先,在Layout下建立兩個xml
fragment1.xml:
1
2
3
4
5
6
7
8
9
10
11
12
13
<code><?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code><code>?></code>
<code><</code><code>LinearLayout</code> <code>xmlns:android</code><code>=</code><code>"http://schemas.android.com/apk/res/android"</code>
<code> </code><code>android:layout_width</code><code>=</code><code>"match_parent"</code>
<code> </code><code>android:layout_height</code><code>=</code><code>"match_parent"</code>
<code> </code><code>android:orientation</code><code>=</code><code>"vertical"</code>
<code> </code><code>android:background</code><code>=</code><code>"#000000"</code> <code>></code>
<code> </code><code><</code><code>TextView</code>
<code> </code><code>android:id</code><code>=</code><code>"@+id/textView1"</code>
<code> </code><code>android:layout_width</code><code>=</code><code>"wrap_content"</code>
<code> </code><code>android:layout_height</code><code>=</code><code>"wrap_content"</code>
<code> </code><code>android:text</code><code>=</code><code>"我是Fragment1"</code>
<code> </code><code>/></code>
<code></</code><code>LinearLayout</code><code>></code>
fragment2.xml:
<code> </code><code>android:background</code><code>=</code><code>"#0000ff"</code><code>></code>
<code> </code><code>android:text</code><code>=</code><code>"我是Fragment2"</code> <code>/></code>
之後建立兩個類:
FragmentFirst類:
<code>package</code> <code>com.zhf.android_fragmentdemo;</code>
<code>import</code> <code>android.app.Fragment;</code>
<code>import</code> <code>android.os.Bundle;</code>
<code>import</code> <code>android.view.LayoutInflater;</code>
<code>import</code> <code>android.view.View;</code>
<code>import</code> <code>android.view.ViewGroup;</code>
<code>public</code> <code>class</code> <code>FragmentFirst </code><code>extends</code> <code>Fragment {</code>
<code> </code><code>@Override</code>
<code> </code><code>public</code> <code>View onCreateView(LayoutInflater inflater, ViewGroup container,</code>
<code> </code><code>Bundle savedInstanceState) {</code>
<code> </code><code>return</code> <code>inflater.inflate(R.layout.fragment1, container, </code><code>false</code><code>);</code>
<code> </code><code>}</code>
<code>}</code>
FragmentSecond類:
<code>public</code> <code>class</code> <code>FragmentSecond </code><code>extends</code> <code>Fragment {</code>
<code> </code><code>return</code> <code>inflater.inflate(R.layout.fragment2, container, </code><code>false</code><code>);</code>
最後一步就是在activity_main.xml中應用這兩個布局檔案:
14
15
16
17
<code><LinearLayout xmlns:android=</code><code>"http://schemas.android.com/apk/res/android"</code>
<code> </code><code>android:layout_width=</code><code>"match_parent"</code>
<code> </code><code>android:layout_height=</code><code>"match_parent"</code>
<code> </code><code>android:orientation=</code><code>"horizontal"</code> <code>></code>
<code> </code><code><fragment</code>
<code> </code><code>android:id=</code><code>"@+id/fragment1"</code>
<code> </code><code>android:name=</code><code>"com.zhf.android_fragmentdemo.FragmentSecond"</code>
<code> </code><code>android:layout_width=</code><code>"0dip"</code>
<code> </code><code>android:layout_height=</code><code>"match_parent"</code>
<code> </code><code>android:layout_weight=</code><code>"1"</code> <code>/></code>
<code> </code><code>android:id=</code><code>"@+id/fragment2"</code>
<code> </code><code>android:name=</code><code>"com.zhf.android_fragmentdemo.FragmentFirst"</code>
<code></LinearLayout></code>
主類MainActivity中不用添加其他代碼,直接加載activity_main.xml即可。
效果圖:
<a href="http://blog.51cto.com/attachment/201310/104714106.png" target="_blank"></a>
ok!簡單三步就将fragment加載進去了,當然這隻是fragment的一小部分功能,它的強大之處其實在于:Activity能夠根據自身情況來動态的加載fragemnt,使你的UI界面變得更加多樣可變!
2.動态加載:(重點)
首先,現将activity_main.xml中多餘部分去掉:
<code> </code><code>android:id</code><code>=</code><code>"@+id/main_layout"</code>
<code> </code><code>android:orientation</code><code>=</code><code>"horizontal"</code> <code>></code>
其次,就是在MainActivity類中動态添加這兩個Fragment類:
18
19
20
21
<code>import</code> <code>android.app.Activity;</code>
<code>import</code> <code>android.view.Display;</code>
<code>public</code> <code>class</code> <code>MainActivity </code><code>extends</code> <code>Activity {</code>
<code> </code><code>protected</code> <code>void</code> <code>onCreate(Bundle savedInstanceState) {</code>
<code> </code><code>super</code><code>.onCreate(savedInstanceState);</code>
<code> </code><code>setContentView(R.layout.activity_main2);</code>
<code> </code><code>Display display = getWindowManager().getDefaultDisplay();</code>
<code> </code><code>if</code> <code>(display.getWidth() > display.getHeight()) {</code>
<code> </code><code>FragmentFirst fragmentFirst = </code><code>new</code> <code>FragmentFirst();</code>
<code> </code><code>getFragmentManager().beginTransaction()</code>
<code> </code><code>.replace(R.id.main_layout, fragmentFirst).commit();</code>
<code> </code><code>} </code><code>else</code> <code>{</code>
<code> </code><code>FragmentSecond fragmentSecond = </code><code>new</code> <code>FragmentSecond();</code>
<code> </code><code>.replace(R.id.main_layout, fragmentSecond).commit();</code>
<code> </code><code>}</code>
運作一下,效果出來了,為了展現出動态,大家可以試着把手機自動轉屏打開,轉一下屏試試!
注:動态加載過程步驟
1.擷取到FragmentManager,在Activity中可以直接通過getFragmentManager得到。
2.調用beginTransaction方法開啟一個事務。
3.向容器内加入Fragment,一般使用replace方法實作,需要傳入容器的id和Fragment的執行個體。
4.送出事務,調用commit方法送出。
介紹完這兩種方式,大家是不是已經對其有了一些感性的認識,這裡注意一下Fragment是在3.0版本引入的,如果你使用的是3.0之前的系統,需要先導入android-support-v4的jar包才能使用Fragment功能,這裡可能需要繼承FragmengActivity(現在建立低版本項目時,ADT會自動将libs下的android-support-v4.jar建構到項目路徑)
接下來我們具體挖掘一下生命周期及其Fragment中一些主要方法的介紹!
二.Fragment類的生命周期
複寫fragment中的方法,測試一下它的生命周期看看它與Activity的異同。
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<code>/**</code>
<code> </code><code>* Fragment的生命周期</code>
<code> </code><code>* 注意: 方法中的排列次序即為fragment全過程:啟動時方法調用次序 + 退出時方法調用次序</code>
<code> </code><code>* @author ZHF</code>
<code> </code><code>*</code>
<code> </code><code>*/</code>
<code> </code>
<code> </code><code>/**Fragment和Activity建立關聯的時候調用**/</code>
<code> </code><code>public</code> <code>void</code> <code>onAttach(Activity activity) {</code>
<code> </code><code>super</code><code>.onAttach(activity);</code>
<code> </code><code>System.out.println(</code><code>"onAttach"</code><code>);</code>
<code> </code><code>public</code> <code>void</code> <code>onCreate(Bundle savedInstanceState) {</code>
<code> </code><code>System.out.println(</code><code>"onCreate"</code><code>);</code>
<code> </code><code>/**為Fragment加載布局時調用**/</code>
<code> </code><code>System.out.println(</code><code>"onCreateView"</code><code>);</code>
<code> </code><code>/**當Activity中的onCreate方法執行完後調用**/</code>
<code> </code><code>public</code> <code>void</code> <code>onActivityCreated(Bundle savedInstanceState) {</code>
<code> </code><code>super</code><code>.onActivityCreated(savedInstanceState);</code>
<code> </code><code>System.out.println(</code><code>"onActivityCreated"</code><code>);</code>
<code> </code><code>public</code> <code>void</code> <code>onStart() {</code>
<code> </code><code>super</code><code>.onStart();</code>
<code> </code><code>System.out.println(</code><code>"onStart"</code><code>);</code>
<code> </code><code>public</code> <code>void</code> <code>onResume() {</code>
<code> </code><code>super</code><code>.onResume();</code>
<code> </code><code>System.out.println(</code><code>"onResume"</code><code>);</code>
<code> </code><code>public</code> <code>void</code> <code>onPause() {</code>
<code> </code><code>super</code><code>.onPause();</code>
<code> </code><code>System.out.println(</code><code>"onPause"</code><code>);</code>
<code> </code><code>public</code> <code>void</code> <code>onStop() {</code>
<code> </code><code>super</code><code>.onStop();</code>
<code> </code><code>System.out.println(</code><code>"onStop"</code><code>);</code>
<code> </code><code>/**Fragment中的布局被移除時調用**/</code>
<code> </code><code>public</code> <code>void</code> <code>onDestroyView() {</code>
<code> </code><code>super</code><code>.onDestroyView();</code>
<code> </code><code>System.out.println(</code><code>"onDestroyView"</code><code>);</code>
<code> </code><code>public</code> <code>void</code> <code>onDestroy() {</code>
<code> </code><code>super</code><code>.onDestroy();</code>
<code> </code><code>System.out.println(</code><code>"onDestroy"</code><code>);</code>
<code> </code><code>/**Fragment和Activity解除關聯的時候調用**/</code>
<code> </code><code>public</code> <code>void</code> <code>onDetach() {</code>
<code> </code><code>super</code><code>.onDetach();</code>
<code> </code><code>System.out.println(</code><code>"onDetach"</code><code>);</code>
列印結果:
1.運作一下:
<a href="http://blog.51cto.com/attachment/201310/124133340.png" target="_blank"></a>
2.傳回退出:
<a href="http://blog.51cto.com/attachment/201310/124220622.png" target="_blank"></a>
3.Home鍵退出:
<a href="http://blog.51cto.com/attachment/201310/124352923.png" target="_blank"></a>
4.再次進入:
<a href="http://blog.51cto.com/attachment/201310/124424752.png" target="_blank"></a>
官網截圖:
<a href="http://blog.51cto.com/attachment/201310/125417247.png" target="_blank"></a>
三.Fragment中有幾個重要的回調方法
方法
描述
onAttach()
Fragment和Activity建立關聯的時候調用
onCreateView()
為Fragment加載布局時調用
onActivityCreated()
當Activity中的onCreate方法執行完後調用
onDestroyView()
Fragment中的布局被移除時調用
onDetach()
Fragment和Activity解除關聯的時候調用
隻有掌握了Fragment中這幾個重要的方法,在使用的過程中才能更加靈活的與Activity配套使用,動态加載以适應不同螢幕分辨率的狀況!
ok! 因為本人也是剛接觸Fragment時間不長,這裡也是查閱了許多的資料,簡單總結了一番,友善以後查閱,希望能幫助到剛接觸fragment的人。
在下一篇部落格中我會使用Fragment+ViewPager寫一個動态加載資料庫的綜合的案例,歡迎大家查閱!
<a href="http://down.51cto.com/data/2363603" target="_blank">附件:http://down.51cto.com/data/2363603</a>
本文轉自zhf651555765 51CTO部落格,原文連結:http://blog.51cto.com/smallwoniu/1308365,如需轉載請自行聯系原作者