Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础
前情提要(Previously)
本系列將使用 Android Studio 將《第一行代碼》(書(shū)中講解案例使用Eclipse)刷一遍,旨在為想入坑 Android 開(kāi)發(fā),并選擇 Android Studio 作為開(kāi)發(fā) IDE 的同學(xué)開(kāi)路。
PS:其實(shí)我就是現(xiàn)學(xué)現(xiàn)賣(mài),希望我能堅(jiān)持刷完。
在前面已經(jīng)學(xué)習(xí)了 Android 四大組件中的 Activity,這次來(lái)學(xué)習(xí)一下Activity 中的 Fragment。
系列目錄在此:
- Android Studio 單刷《第一行代碼》系列目錄
摘要(Abstract)
Fragment 的簡(jiǎn)介、簡(jiǎn)單使用、動(dòng)態(tài)加載。
Fragment 是什么
先來(lái)看看?API Guides?里是怎么說(shuō)的。
- A Fragment represents a behavior or a portion of user interface in an Activity. You can combine multiple fragments in a single activity to build a multi-pane UI and reuse a fragment in multiple activities. You can think of a fragment as a modular section of an activity, which has its own lifecycle, receives its own input events, and which you can add or remove while the activity is running (sort of like a "sub activity" that you can reuse in different activities).
A fragment must always be embedded in an activity and the fragment's lifecycle is directly affected by the host activity's lifecycle. - ?
- Fragment 必須嵌入在 Activity 中使用。
- Fragment 的生命周期 是受 Activity 影響的。
- 可以在一個(gè) Activity 中使用多個(gè) Fragment。
- Fragment 可以在多個(gè) Activity 中重用。
說(shuō)了這么多,也沒(méi)說(shuō) Fragment 到底是什么,只好繼續(xù)往下看。
Design Philosophy(設(shè)計(jì)理念)
Android introduced fragments in Android 3.0 (API level 11), primarily to support more dynamic and flexible UI designs on large screens, such as tablets. Because a tablet's screen is much larger than that of a handset, there's more room to combine and interchange UI components. Fragments allow such designs without the need for you to manage complex changes to the view hierarchy. By dividing the layout of an activity into fragments, you become able to modify the activity's appearance at runtime and preserve those changes in a back stack that's managed by the activity.
- Android3.0 里出現(xiàn)的。
- 為了更加合理和充分地利用大屏幕的空間。
其實(shí)就是為了更好的同時(shí)支持手機(jī)和平板(我是這么認(rèn)為的)。看下面這個(gè)來(lái)自 Android API Guides 中的圖就明白了。
Fragment 簡(jiǎn)單使用
練習(xí)開(kāi)始,新建一個(gè) FragmentTest 的項(xiàng)目,在一個(gè) Activity 中添加兩個(gè) Fragment,并列顯示。
- 新建一個(gè)左側(cè)布局 left_fragment.xml,放一個(gè) Button 在里面,代碼如下:
?
<Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="Button" />?
-
同樣的新建一個(gè)右側(cè)布局 right_fragment.xml,放一個(gè) TextView 在里面,代碼省略。
-
新建 LeftFragment 類,繼承自 Fragment,重寫(xiě) onCreateView() 方法,在這個(gè)方法中通過(guò) LayoutInflater 將布局動(dòng)態(tài)加載進(jìn)來(lái),代碼如下:
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;
}
}
-
同樣新建 RightFragment 類,代碼省略。
-
修改 activity_main.xml,刪掉默認(rèn)的 TextView 添加 Fragment,代碼如下:
這樣最簡(jiǎn)單的 Fragment 示例就寫(xiě)好了,運(yùn)行一下程序看看吧。
動(dòng)態(tài)添加 Fragment
- 新建一個(gè) another_right_fragment.xml,放一個(gè) TextView 在里面,設(shè)定布局的顏色、TextView 的內(nèi)容,代碼如下:
?
<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:text="this is another right fragment."android:textSize="20sp" />?
-
同樣新建一個(gè) AnotherRightFragment 類,代碼省略。
-
修改 activity_main.xml 的代碼,將右側(cè)的 Fragment 放在 FrameLayout 中,代碼如下:
- 修改 MainActivity 中的代碼,在點(diǎn)擊 Button 是動(dòng)態(tài)添加 Fragment,代碼如下:
這樣就完成了,運(yùn)行一下看看吧。小結(jié)一下動(dòng)態(tài)添加 Fragment:
利用返回棧管理 Fragment
運(yùn)行之前的程序,點(diǎn)擊 Button 動(dòng)態(tài)添加 Fragment 后,按下 Back 鍵我們發(fā)現(xiàn)程序直接退出了。那么能不能做到按 Back 鍵回到上一個(gè) Fragment 呢?
超簡(jiǎn)單,在這句代碼?transaction.commit();?前再加一句代碼?transaction.addToBackStack(null);?就可以了,試試看吧。
2015-03-21 更正
按照上面寫(xiě)的加上這句代碼?transaction.addToBackStack(null);?之后,我發(fā)現(xiàn)按下 Back 仍然沒(méi)有返回上一個(gè) Fragment,還是直接退出程序了。Google Baidu 查了好久也沒(méi)弄明白原因。
寫(xiě)了個(gè)解決辦法,在 MainActivity 中重寫(xiě)了 onPressed() 方法,代碼如下:
@Override // 按下 Back 按鈕時(shí)觸發(fā) public void onBackPressed(){FragmentManager fragmentManager = getFragmentManager();// 判斷 BackStack 中是否有 FragmentTransactionif(fragmentManager.getBackStackEntryCount() > 0){// FragmentTransaction 出棧,恢復(fù)前一個(gè) FragmentfragmentManager.popBackStack();return;}super.onBackPressed(); }其它(Miscellaneous)
盡管我試圖在本文中盡量完整的進(jìn)行描述,但受限于篇幅和我的個(gè)人水平,本文難免有所遺漏,歡迎在評(píng)論中指出。
如果您覺(jué)得閱讀本文對(duì)您有幫助,請(qǐng)點(diǎn)一下“推薦”按鈕,您的“推薦”將是我最大的寫(xiě)作動(dòng)力!
關(guān)于作者(About Me)
addict
原文鏈接:http://www.cnblogs.com/DebugLife/p/4355669.html
總結(jié)
以上是生活随笔為你收集整理的Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android Studio 单刷《第一
- 下一篇: Android Studio 单刷《第一