關於Fragment學習小結

一、前期問題

我想要實現類似微信底部標籤的切換功能(如下圖),在之前沒接觸fragment的時候,第一的想法是在activity之間互相跳轉,但是這樣不僅會使底部標籤這一部分的代碼重複,而且增加開銷,所以在這裏使用fragment是很合適的。這裏寫圖片描述

二、fragment和Activity的關係

fragment代表activity工作,他的狀態應該反映activity的狀態。fragment的生命週期是由activity託管而不是操作系統調用。
fragment的完整生命週期如下:
onAttach→onCreate→onCreateView→onStart→onResume(可見狀態)
→onPause→onStop→onDestory→onDetach

三、fragment的使用

  1. 在activity的佈局文件中爲fragment安排位置(activity_main.xml)
<!--這裏相當於我把整一個屏幕託管給了fragment-->
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_frag"    <!--命名爲了fragment能夠找到其佈局-->
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white">

</RelativeLayout>
  1. 新建fragment的佈局xml文件(fragment_test.xml)
<!--簡單的在佈局里加了一個TextView-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">

    <TextView
        android:id="@+id/hello_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textColor="@color/black"
        android:text="hello_world"/>

</RelativeLayout>
  1. 創建Fragment類,加載Fragment佈局(testFragment.java)
public class testFragment extends Fragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //加載fragment的佈局
        View view = inflater.inflate(R.layout.fragment_test, container, false);
        /* 
        加載控件以及實現邏輯功能都在onCreateView()中實現,而不是onCreate();
        */
       return view;
    }
}
  1. 將fragment添加到activity中
public class FrontPage extends FragmentActivity {
    private Fragment fragment;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_fragment_front);

        /*fragment註冊*/
        //FragmentManger管理着fragment事務的回退棧
        FragmentManager fm = getSupportFragmentManager(); 
        //加載其在activity佈局中的位置
        fragment = fm.findFragmentById(R.id.activity_frag);

        fm.beginTransaction().    //beginTransaction()返回FragmentTransaction實例
            add(R.id.page_content, firstPage).      //向隊列中添加fragment
            commit();                               //最後提交

}

四、fragment的切換方法(介紹兩種)

1、此方法原fragment依舊會保持resume狀態
fragmentManager.beginTransaction().hide(fragment1).show(fragment2).commit();

2、 此方法下原fragment會被銷燬

Fragment fragment = new Fragment2();
//獲取Fragment事務實例
FragmentTransaction transaction = getFragmentManager().beginTransaction();
//用replace方式替換,
transaction.replace(R.id.page_content,fragment);

五、例子

git例子鏈接

小結

參考《android編程權威指南》以及自己在實際運用時的感悟寫下此記錄,如有錯誤歡迎指正

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章