用Fragment建立模組化元件
阿新 • • 發佈:2019-01-05
Fragment類似於Activity,有自己的layout佈局,也有一系列相關的生命週期方法。在Activity執行(resumed)期間,它的生命週期可以獨立地控制,但當Activity停止或銷燬時,尚未銷燬的它將一起被停止或銷燬。它是View的子類ViewGroup的子類。
package com.company.app;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class ExampleFragment extends Fragment {
// 建立自身的整個佈局檢視
@Override
public View onCreateView(LayoutInflater inflater,
ViewGroup container, Bundle savedInstanceState) {
// 若Activity沒有建立檢視,那麼Fragment也沒必要建立
if(null == container){
return null;
}
return inflater.inflate(R.layout.example_fragment, container, false);
}
// 可選自定義介面。
// 若Activity實現它,則Fragment在需要時可以這樣回撥:
// getActivity().onFragmentEvent();
// 也可以在onAttached(Activity)裡先儲存好Activity:
// mOnFragmentEventListener = (OnFragmentEventListener) activity;
// 然後需要時就可以回撥:
// mOnFragmentEventListener.onFragmentEvent();
public interface OnFragmentEventListener {
public void onFragmentEvent();
}
}
Fragment在Activity的佈局檔案中可定義如下:
<fragment
android:id="@+id/example_fragment"
android:name="com.company.app.ExampleFragment"
android:layout_width="寬度"
android:layout_height="高度" />
系統會自動例項化對應的Fragment子類物件,並呼叫其onCreateView方法來給其佈局。
也可在Activity的佈局檔案中先定義一個ViewGroup容器:
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="寬度"
android:layout_height="高度" />
並且在Activity中實現如下程式碼:
// 1.獲取Fragment管理器
FragmentManager fragmentManager = getFragmentManager();
// 2.獲取Fragment事務
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
ExampleFragment exampleFragment = new ExampleFragment();
// 3a.新增Fragment控制元件到一個ViewGroup容器中。
// 第一個引數是ViewGroup容器的ID,
// 可以是Fragment自身的或者是容納它的ViewGroup容器的,下同
fragmentTransaction.add(R.id.fragment_container, exampleFragment);
// 3b.或者刪除
fragmentTransaction.remove(exampleFragment);
// 3c.或者替換。相當於remove和add二合一。
fragmentTransaction.replace(R.id.fragment_container, new ExampleFragment());
// 可選操作:把被刪除或者被替換的舊Fragment加入棧。
// 這樣舊Fragment將會被停止而不是被銷燬,以備導航返回。
// 當呼叫FragmentManager.popBackStack(),
// 或者使用者點選螢幕底部的返回鍵時,就可以導航回這個舊Fragment。
fragmentTransaction.addToBackStack(null);
// 3d.或者隱藏
fragmentTransaction.hide(exampleFragment);
// 3e.或者顯示
fragmentTransaction.show(exampleFragment);
// 4.提交Fragment事務,非同步更新介面
fragmentTransaction.commit();
/* ------------------------------------------------ */
// 從Activity中獲取Fragment例項。
fragmentManager.findFragmentById(R.id.xxx);