一、前期問題
我想要實現類似微信底部標籤的切換功能(如下圖),在之前沒接觸fragment的時候,第一的想法是在activity之間互相跳轉,但是這樣不僅會使底部標籤這一部分的代碼重複,而且增加開銷,所以在這裏使用fragment是很合適的。
二、fragment和Activity的關係
fragment代表activity工作,他的狀態應該反映activity的狀態。fragment的生命週期是由activity託管而不是操作系統調用。
fragment的完整生命週期如下:
onAttach→onCreate→onCreateView→onStart→onResume(可見狀態)
→onPause→onStop→onDestory→onDetach
三、fragment的使用
- 在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>
- 新建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>
- 創建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;
}
}
- 將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);
五、例子
小結
參考《android編程權威指南》以及自己在實際運用時的感悟寫下此記錄,如有錯誤歡迎指正