碎片Fragment
https://developer.android.google.cn/guide/components/fragments.html
一、什么是Fragment
Fragment(碎片)就是小型的Activity,它是在Android3.0時出現的。Fragment是表現Activity中UI的一個行為或者一部分。
可以把fragment想象成activity的一個模塊化區域,有它自己的生命周期,接收屬于它自己的輸入事件,并且可以在activity運行期間添加和刪除(有點像一個可以在不同的activity中重用的“子Activity”)。
Fragment必須被嵌入到一個activity中。它們的生命周期直接受其宿主activity的生命周期影響。當一個activity正在運行時,就可以獨立地操作每一個Fragment,比如添加或刪除它們。
Fragment可以定義自己的布局、生命周期回調方法,因此可以將fragment重用到多個activity中,因此可以根據不同的屏幕尺寸或者使用場合改變fragment組合。
二、如何創建一個Fragment
1、為Fragment定義一個布局
2、定義類繼承Fragment
3、重寫類中的onCreateView()方法,返回一個View對象作為當前Fragm
ent的布局。
fragment第一次繪制它的用戶界面的時候,系統會調用onCreateView()方法。為了繪制fragment的UI,此方法必須返回一個作為fragment布局的根的view。如果fragment不提供UI,可以返回null。
/*** 定義類繼承Fragment*/public class TitleFragment extends Fragment {@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {//使用打氣筒填充生成一個View對象,fragment_title是一個布局的根節點View view = inflater.inflate(R.layout.fragment_title, null);return view;}}三、如何將Fragment添加到Activity
Activity必須在清單文件中進行聲明,但是Fragment不需要,Fragment只需要在Activity的布局文件中聲明就可以了。
<fragment android:id="@+id/fmt_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:name="com.itheima.fragment.TitleFragment" />注意:代碼中的四個屬性是必須的要給的,“android:name”屬性:指定了在layout中實例化的Fragment類是哪個。當系統創建這個activity
layout時,它實例化每一個在layout中指定的Fragment,并調用它們的onCreateView()方法,來獲取每一個Fragment的layout,系統將從Fragment返回的View直接插入到<fragment>元素所在的地方每一個fragment都需要一個唯一的標識,如果activity重啟,系統可以用來恢
復Fragment,并且可以用id來捕獲Fragment來處理事務,例如移除它。
有3種方法來為一個fragment提供一個ID,具體如下所示:
- 為android:id屬性提供一個唯一ID;
- 為android:tag屬性提供一個唯一字符串;
- 如果以上2個你都沒有提供,系統將使用容器view的ID;
四、如何切換Fragment
要在activity中管理Fragment,需要使用FragmentManager可以通過調用activity的getFragmentManager()取得它的實例。
案例:點擊不同的按鈕切換到不同的Fragment進行顯示。具體實現步驟:
1、設置布局文件:添加三個按鈕用于切換Fragment,并在按鈕下方
添加一個FrameLayout用來替換成響應的Fragment。
2、創建三個Fragment,SportsFragment、NewsFragment、GameFragment。
其余兩個Fragment跟SportsFragment代碼一致,只是布局文件不同。
3、添加切換Fragment的邏輯,這個是新聞頻道按鈕的點擊事件
sports()方法、games()方法同上,因此不再給出代碼清單。
4、運行程序,效果如下
Fragment的生命周期
Fragment的生命周期和activity生命周期很像,其生命周期方法如下所示。
- onAttach:綁定到activity
- onCreate:創建fragment
- onCreateView: 創建fragment的布局
- onActivityCreated: activity創建完成后
- onStart: 可見, 不可交互
- onResume: 可見, 可交互
- onPause: 部分可見, 不可交互
- onStop:不可見
- onDestroyView: 銷毀fragment的view對象
- onDestroy: fragment銷毀了
- onDetach: 從activity解綁了
五、Fragment的向下兼容
Fragment是在Android3.0才推出的,若想在3.0的低版本下使用Fragment,則需要執行下面2步:
1、把所有Fragment和FragmentManager改成support-v4包下的類
2、把Activity的繼承改為FragmentActivity(support-v4包下的)
六、Fragment之間的通信案例
案例:創建一個用于顯示選項卡的Fragment和一個用于顯示內容的Fragment,當選項卡切換時,使內容的Fragment信息跟著一起切換。具體實現步驟如下所示:
1、先創建選項卡Fragment和內容Fragment,并在activity_main.xml布
局文件中進行設置,其布局效果如下:
2、為選項卡Fragment創建布局文件,其布局效果如下:
3、添加內容區域Fragment的代碼邏輯
4、添加選項卡區域Fragment的代碼邏輯
public class TabFragment extends Fragment implements OnItemClickListener {private String[] datas;private int[] picIds;@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroupcontainer, Bundle savedInstanceState) {//直接使用ListView作為布局,因此不需要布局文件ListView listView = new ListView(getActivity());//定義一些常量數據作為冊數數據datas = new String[]{"新聞", "體育", "財經", "社會", "娛樂", "國際"};picIds = new int[]{R.drawable.a0, R.drawable.a1, R.drawable.a2, R.drawable.a3, R.d rawable.a4, R.drawable.a5};//設置點擊事件listView.setOnItemClickListener(this);//聲明一個ArrayAdapter對象ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),android.R.layout.simple_expandable_list_item_1, datas);//給ListView設置AdapterlistView.setAdapter(adapter);//返回視圖return listView;}@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {//獲取當前的title和圖片idString title = datas[position];int picId = picIds[position];//獲取Fragment管理器FragmentManager manager = getFragmentManager();//通過ID選擇出ContentFragment對象ContentFragment fragment = (ContentFragment) manager.findFragmentById(R.id.fragment_content);//調用ContentFragment的方法,給ContentFragment傳遞參數,實現不同Fragment直接的通信fragment.setTitleAndImage(title, picId);}}Fragment與Activity如何交互?
這里我不再詳細介紹那寫比較常規的方式,例如靜態變量,靜態方法,持
久化,application全局變量,收發廣播等等。
首先我們來介紹使用Handler來實現Fragment與Activity
的交互。第一步,我們需要在Activity中定義一個方法用來設置Handler對象。
public void setHandler(Handler handler) {
mHandler = handler;
}
第二步,在Fragment中的回調函數onAttach()中得到Fragment所在Activity,并調用setHandler方法,設置Handler。該Handler在Fragment中定義,用來接收消息與Fragment進行交互。
然后我們可以在Activity中發送消息給Fragment中的Hanlder進行交互。
public void inter(View view) { Message msg = new Message(); msg.obj = edit.getText().toString(); msg.what = 1; mHandler.sendMessage(msg); }Fragment回退棧實現
public class MainActivity extends FragmentActivity implements OnClickListener {private FragmentA fragmentA;private FragmentB fragmentB;private FragmentC fragmentC;private List<Fragment> fragmentsList = new ArrayList<Fragment>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);findViewById(R.id.btnA).setOnClickListener(this);findViewById(R.id.btnB).setOnClickListener(this);findViewById(R.id.btnC).setOnClickListener(this);fragmentA = new FragmentA();fragmentB = new FragmentB();fragmentC = new FragmentC();//將三個Fragment添加到幀布局中/** 1. 獲取FragmentManger*/FragmentManager fragmentManager = getSupportFragmentManager();/** 2. 通過FragmentManager獲取到事務管理器*/FragmentTransaction transaction = fragmentManager.beginTransaction();/** 3. 將Fragment添加到幀布局中*/transaction.add(R.id.fl, fragmentA, "FragmentA").add(R.id.fl, fragmentB,"FragmentB").add(R.id.fl, fragmentC,"FragmentC").hide(fragmentB).hide(fragmentC).commit();addToBackStack(fragmentA);}private void addToBackStack(Fragment fragment) {if (fragmentsList.contains(fragment)) {//先將老的對象移除fragmentsList.remove(fragment);//將Fragment添加到集合的最后fragmentsList.add(fragment);}else {fragmentsList.add(fragment);}}@Overridepublic void onBackPressed() { // super.onBackPressed();if (fragmentsList.size()>1) {//移除最頂端的FragmentfragmentsList.remove(fragmentsList.size()-1);//將下一個Fragment給顯示出來showFragment(fragmentsList.get(fragmentsList.size()-1));}else {//如果當前棧中沒有Fragment或者只有一個Fragment,直接退出Activityfinish();}}private void showFragment(Fragment fragment) {FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();transaction.hide(fragmentA).hide(fragmentB).hide(fragmentC).show(fragment).commit();}@Overridepublic void onClick(View v) {FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();transaction.hide(fragmentA).hide(fragmentB).hide(fragmentC);switch (v.getId()) {case R.id.btnA:transaction.show(fragmentA);addToBackStack(fragmentA);break;case R.id.btnB:transaction.show(fragmentB);addToBackStack(fragmentB);break;case R.id.btnC:transaction.show(fragmentC);addToBackStack(fragmentC);break;default:break;}//把當前事務添加到會退棧中 // transaction.addToBackStack(null);transaction.commit();}}總結
以上是生活随笔為你收集整理的碎片Fragment的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: View类的xml属性和相关方法说明
- 下一篇: Android LayoutAnimat