Android----Fragments详解
Fragments 概念是在Android3.0版本就已經有了,3.0版本是Tab(平板)專用,后來在4.0以上的版本繼續沿
用Fragments,改善了Activity的靈活性。
? ? ? ?
? ? ? ? 在沒有Fragments之前,一個屏幕就只能放一個Activity,有了Fragments之后,一個屏幕也只能放一個Anticity,但Activity里可以包含多個Fragments,Fragments因此也被成為子Activity,但是Fragments不是Activity的subClass,Fragments直屬Object子類。
?
下面例子一個Activity包含兩個Fragments 左邊一個現實Title ?右邊一個現實相應的content。
?
?
? ? ? ? Fragments 必須寄生在Activity里面,不能脫離Activity而存在,與Activity一樣,Fragments同樣具有自己的生命周期,其生命周期比Activity更復雜,但是Fragments的生命周期受Activity影響,隨著Activity結束而結束。
?
??
?? ? ? ??
1.onAttach(Activity)?在Fragments和Activity關聯時候回調,可以進行一些限制條件的判定。
2.?onCreate(Bundle)?和Activity一樣
3.?onCreateView(LayoutInflater, ViewGroup, Bundle)?View在這里初始化,并返回給Fragments
4.?onActivityCreated(Bundle)?在Activity.onCreate().也就是Activity初始化后,會會掉Fragments這個函數
5.?onStart()??
6.?onResume()??
1.?onPause()??
2.?onStop()??
3.?onDestroyView()?
4.?onDestroy()??
?
5.?onDetach()??
?
Demo示例:
? ?主Activity
? ?
package com.example.fragmenttest;import com.example.fragmenttest.FragmentTitle.OnTtileClickListener;import android.os.Bundle; import android.app.Activity; import android.app.FragmentTransaction; import android.database.sqlite.SQLiteDatabase; import android.view.Menu;/*** 主Activity* @author ccf* */ public class MainActivity extends Activity implements OnTtileClickListener {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}@Overridepublic void onTtitleClick(String content) {FragmentContent content2 = FragmentContent.getInstance(content);getFragmentManager().beginTransaction().replace(R.id.mContent, content2).commit();}@Overridepublic void onBackPressed() {// TODO Auto-generated method stubsuper.onBackPressed();} }?
?
XML布局文件
?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><fragmentclass="com.example.fragmenttest.FragmentTitle"android:id="@+id/titleList"android:layout_width="0dip"android:layout_height="fill_parent"android:layout_weight="1"/><FrameLayoutandroid:id="@+id/mContent"android:layout_width="0dip"android:layout_height="fill_parent"android:layout_weight="2"/></LinearLayout>?
? fragment ?只是一個占位符,class屬性,標志該占位符代表哪個Fragments.
??FrameLayout 作為父容器,放用來置Fragments。
?
?
FragmentTitle ?Activity左邊的Title列表,繼承了ListFragment。 ? ,ListFragment持有一個ListView
package com.example.fragmenttest;import android.annotation.SuppressLint; import android.app.FragmentTransaction; import android.app.ListFragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.ListView;@SuppressLint("NewApi") public class FragmentTitle extends ListFragment {private final static String title[] = { "龍騎士", "死靈騎士", "死神來了", "第一滴血" };private final static String content[] = {" 曾經和平富饒的國度阿拉蓋西亞,如今陷在邪惡國王(約翰·馬爾科維奇 John Malkovich 飾)的暴政統治下,期待神靈解救敢怒不敢言的人民。一日,農家少年伊拉貢(艾德·斯皮爾斯 Ed Speleers 飾)在林中拾獲一枚奇石,不想竟是一枚龍卵,孵出一只藍色飛龍。伊拉貢為小龍取名“薩菲拉”,遇到先知布魯姆(杰瑞米·艾恩斯 Jeremy Irons 飾)后,才明白這是一場怎樣的機緣——曾經守護這片土地的龍騎士應該回來了,帶領人民找回自由。在布魯姆的指導下,伊拉貢開始學習劍術和馭龍技巧,慢慢從一個普通少年成長為擔當重任的龍騎士,前路危險重重,前路通向光明…… ","莫羅(伊德瑞斯·艾爾巴 Idris Elba 飾)請求布雷斯把小孩丹尼帶來神殿以避免惡魔奪取他的靈魂,作為回報他將驅除布雷斯身上的詛咒。丹尼是魔鬼羅爾科的兒子,羅爾科為了把自己的魔力植入兒子體內正派卡里跟追蹤逃跑途中的母子兩人。正當母子倆被困在采石場的時候,布雷斯到來,他體內的天使爆發了出來,壓制住了卡里根。他變成了惡靈騎士,毫不手軟的把對手撕成碎片。當戰爭結束時,三人前往神殿,同時,羅爾科也救醒了死亡邊緣的卡里根,并賦予他更可怕的摧毀力,讓他再去把丹尼找回來。 在神殿里,莫羅履行協議把布雷斯體內的扎薩羅斯驅趕了出來。但正當他做法時,神殿的牧師試圖殺死丹尼——他認為丹尼就是惡魔。還沒等他們行動,卡里根就到了。把丹尼帶去見了","某公司組織一次遠游,雖然員工們各懷心事,不過他們還是踏上了歡樂的旅途。在經過一座巨大的吊橋時,年輕人山姆(Nicholas D'Agosto 飾)突然看到幻象,幻象中大橋開始垮塌,包括他、同事、朋友在內無數人在這起事故中遇難。當他從幻象中醒來時,周邊的種種跡象表明那場災難即將到來。慌亂之中,他和朱莉(艾瑪·貝爾 Emma Bell 飾)、皮特(Miles Fisher 飾)、坎蒂絲(Ellen Wroe 飾)、奧利維亞(Jacqueline MacInnes Wood 飾)等8個人下了車。災難隨即發生,山姆等人成為車上僅有的幸存者。 但是命運并未偏袒這幾名幸運兒,死神仍時刻逡巡在他們的周圍。死神來了,無論逃到天涯海角也沒有用…"," 退伍軍人蘭博(西爾維斯特?史泰龍Sylvester Stallone 飾)從越南回國,他回到已顯得陌生的原居小鎮,當地警長(布萊恩?丹內利 Brian Dennehy 飾)看到這個退伍軍人的第一眼起,就開始對蘭博百般挑剔,甚至將他帶回警局肆意侮辱,不堪忍受責打的蘭博襲警之后逃跑。警長召集大批警察展開對蘭博的追捕,蘭博逃至荒山野林之中,不斷用自己在越戰中掌握的游擊戰術對警察展開反擊,他了一輛武器運輸車返回小鎮燒毀了商店,法律和武器都不能阻止蘭博了。蘭博在越戰時的長官上校(理查德?克里納 Richard Crenna 飾)出現,勸說蘭博放下槍械,憤懣已久的蘭博吼出了自己的困惑與不甘…… " };@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);getListView().setBackgroundColor(getResources().getColor(android.R.color.darker_gray));setListAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, title));}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {return super.onCreateView(inflater, container, savedInstanceState);}@Overridepublic void onListItemClick(ListView l, View v, int position, long id) {// TODO Auto-generated method stubsuper.onListItemClick(l, v, position, id);OnTtileClickListener listener = (OnTtileClickListener) (getActivity());listener.onTtitleClick(content[position]);}@Overridepublic void onPause() {super.onPause();}public interface OnTtileClickListener {public void onTtitleClick(String content);} }?
?
FragmentContent是右邊詳細內容顯示區域。
?
package com.example.fragmenttest;import android.annotation.SuppressLint; import android.app.Fragment; import android.app.ListFragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ListView; import android.widget.ScrollView; import android.widget.TextView;@SuppressLint("NewApi") public class FragmentContent extends Fragment {private String strContent;public static FragmentContent getInstance(String strContent) {FragmentContent content = new FragmentContent();content.strContent = strContent;return content;}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {super.onCreateView(inflater, container, savedInstanceState);ScrollView scrollView = new ScrollView(getActivity());TextView mTextView = new TextView(getActivity());mTextView.setPadding(5, 5, 5, 5);mTextView.setTextSize(15);mTextView.setText(strContent);scrollView.addView(mTextView);scrollView.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light));return scrollView;}@Overridepublic void onPause() {// TODO Auto-generated method stubsuper.onPause();}}?
? ? ?MainActivity類很簡單。 ?onCreate(Bundle savedInstanceState)函數只是簡單調用setContentView().,加上實現了FragmentTitle 中自定義的 OnTitleClickListener接口外,并未做什么其他初始化,FragmentTitle的初始化是在他自己的 onActivityCreated(Bundle savedInstanceState) 中進行的。
當Activity 調用onCreate()后,就會調用FragmentTitle?onActivityCreated(Bundle savedInstanceState)? ?來完成左邊標題列表的初始化。
@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);getListView().setBackgroundColor(getResources().getColor(android.R.color.darker_gray));//設置背景顏色setListAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1, title));//調用該方法初始化列表 }?
mainActivity 實現FragmentTitle 中自定義的 OnTitleClickListener 接口,FragmentTitle就可以可以在
?onListItemClick(ListView l, View v, int position, long id)
?
@Overridepublic void onTitleClick(String content) {FragmentContent content2 = FragmentContent.getInstance(content);getFragmentManager().beginTransaction().replace(R.id.mContent, content2).commit();}?
@Overridepublic void onListItemClick(ListView l, View v, int position, long id) {// TODO Auto-generated method stubsuper.onListItemClick(l, v, position, id);OnTitleClickListener listener = (OnTitleClickListener) (getActivity());listener.onTitleClick(content[position]);}?
? ? ?如何對Activity中的Fragment進行操作呢?
? ? ?在onTitleClick(String content)回調函數中,調用getFragmentManager()函數,獲取FragmentManager實例,再通過FragmentManager?的beginTransaction()函數獲得FragmentTransaction實例。
? ? 利用FragmentTransaction實例 ?就可以對Fragments實例進行操作,有以下幾個基本操作
add()??把Fragments實例和Activity關聯起來
hide()??把Activity中存在的Fragments影藏起來,對應盈利個函數show() ?把已經被影藏的Fragments顯示出來
remove()?把Activity中的Fragments移除掉。
replace()?用指定Fragments的替換另一個Fragments 相當于remove()+add()
commit()?以上操作并需經過commit()?條件該transaction(事務)后才生效。
?
當
?
Fragments和Activity之間的通訊:
??? ? 1.在Activity中可以通過FragmentManager 兩個方式獲取到相應的Fragments
? ? ? ?findFragmentById(int id) ? ?通過xml布局文件中注冊的id獲取該實例,這種Fragments必須在布局文件正聲明其id
? ? ? ?findFragmentByTag(String tag) ?通過tag找到實例 ?,tag是改Fragments實例在被?FragmentTransaction#add(int containerViewId, Fragment fragment, String tag) ?作為最后一個參數傳入,tag要保持其唯一性,因為他是對應Fragments實例的唯一標識。
?
? ? ? 2. Fragments中可以通過getActivity()獲取到對應的Activity實例
?
?
?
?
?
轉載于:https://www.cnblogs.com/chenchuangfeng/archive/2013/06/02/3113608.html
總結
以上是生活随笔為你收集整理的Android----Fragments详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2003,VS2005,VS2008
- 下一篇: 浏览网页时看到一个把字符串偶数位转化为大