iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0

接續上一次有點提過的內容Fragment,經過一年,我認為這還可以再講的詳細些,這也是很多初學者一直都不太清楚的部分,所以我決定來講一下,希望能幫助到受Fragmet所可的同學。

生命週期

onAttach -> onCreate -> onCreateView -> onViewCreated -> onStart -> onResume -> onPause -> onStop -> onDestoryView -> onDestory -> onDetach
粗體為未銷毀時的起點和離開點

  • onAttach :當Fragment與Activity產生關連時進入,並與之綁定。
  • onCreate :建立Fragment時進,與Activity同,負責進行初始化。
  • onCreateView :首次產生畫面時呼叫,在此建立顯示的View。
  • onViewCreated :View裡的元件開始建立,指定與初始化View裡的元件。
  • onStart :啟動 Fragment 時回調,此時Fragment可見,不過並沒有在前臺顯示,因此無法與使用者互動。
  • onResume :Fragment在前臺可見,可以與使用者互動。
  • onPause :Fragment處於暫停狀態,處於可見狀態,但不能使用者與互動。
  • onStop :停止Fragment時回調,此時Fragment處於不可見狀態。
  • onDestoryView :銷毀與Fragment有關的View,但尚未與Activity解除Attach。
  • onDestory :銷毀Fragment 時被回調,Fragment被回收時呼叫此方法。
  • onDetach :與onAttach相對,當Fragment與Activity取消關聯時呼叫。

傳值

  1. Activity 傳值給 Fragment
    首先生成要傳入的Fragment的例項,接者新增Bundle放入要傳得值。
    最後setArgument(bundle) 等到進入該Fragment後,透過getArgument().getString()之類等直接獲取。
//new 實例時傳入(setArguments)
public static CFragment newInstance(String param1, String param2) {
        CFragment fragment = new CFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }
//onCreate時拿取(getArguments)
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

跳轉

  1. Fragment 跳轉至 Activity
    透過 getActivity 拿到所在的 Activity
Intent intent = new Intent(getActivity(),FragmentTwoActivity.class);
startActivity(intent);

切換

每次切換都要開新的Traction,不然不會有反應。

  • replace
//如果堆疊裡只有一個則會自動show
getSupportFragmentManager().beginTransaction().replace(R.id.fl_container,aFragment).commit();

//如果堆疊不只有一個則需加上show,replace會銷毀Fragment,生命週期會重跑
getSupportFragmentManager().beginTransaction().replace(R.id.fl_container,aFragment).show(aFragment).commit();

//如果都在堆疊裡,可透過hide、show控制,生命週期不會重跑。
getSupportFragmentManager().beginTransaction().hide(aFragment).show(bFragment).commit();

以上為Fragment大致的功能,這是我目前遇到過的情況,希望對需要Fragmet的同學來說算充實。


上一篇
精華筆記 Day5--DatePicker、TimePicker
下一篇
精華筆記 Day7--File 讀/寫/刪
系列文
android studio 30天 精華筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言