星期三, 11月 09, 2011

Fragment (七)

Android應用程式學習筆記

Managing Fragments

管理在你的activity的fragments,需要使用FragmentManager,從activtiy呼叫getFragmentManager()方法取得FragmentManager。

FragmentManager可以完成以下工作:

  • 取得存在於activity的fragment,findFragmentById()方法(有在activity布局中提供UI的fragment)或是findFragmentTag()方法(沒有在activity佈局中提供UI的fragment)。
  • 將fragment從back stack中拿出,popBackStack()方法。
  • 向back stack註冊一個監聽器,監聽改變,addBackStackChangedListener()方法。

Performing Fragment Transactions

在activity中與使用fragment有關的最重要議題就是增加、移除、替換及運用fragment執行其他工作,回應用戶的互動。你託付給activity的每一組fragment變化稱為一個transaction且你可以使用FragmentTransaction的APIs組織一個transaction。你可以將transaction存在back stack由activity管理,允許用戶反轉fragment變化。

你可以從FragmentManager獲得FragmentTransaction實例,像是這樣:

FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
每個transaction都是你想在同意時間執行的變化組合,你可以使用比如add()、remove()、replace()方法組織所有你想要執行的變化為一個transaction,然後將transaction應用在activity上,最後你必須呼叫commit()方法。

在呼叫commit()方法之前,你可能想要呼叫addToBackStack()方法,為了增加transaction到fragment transaction的back stack。Back stack由activity管理且允許用戶按"BACK"按鈕回傳前一個fragment的狀態。

舉例,你如何將fragment由另一個fragment替換,並且將先前的狀態保存在back stack。

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();
// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);
// Commit the transaction
transaction.commit();
此例中,newFragment取代了目前在布局容器中ID為R.id.Fragment_container的fragment,藉由呼叫addToBackStack()方法,替換的transaction被存到back stack中,所以用戶可以反轉transaction並且透過"BACK"按鈕返回先前的fragment。

如果增加更多變化到transaction(比如其他add()、remove())並呼叫addToBackStack()方法,在呼叫commit()之前所有變化都會增加到back stack作為一個transaction且"BACK"可以將transaction一起反轉。

將變化加到FragmentTransaction的順序並不重要,除了:
  • 必須在最後時呼叫commit()方法。
  • 如果要增加多個fragment到同一個容器,加入的順序決定了出現在view階層的順序。
如果在執行transaction移除fragment時,沒有呼叫addToBackStack()方法,然後,transaction被commit,fragment被銷毀,用戶就無法在回去,反之,如果有呼叫addToBackStack()方法,fragment被停止,當用戶想回去時,fragment就會再次恢復。

呼叫commit()方法後並不會立即執行transaction,由activity的UI執行續安排。如果需要,可以從UI執行續呼叫executingPandingTransaction()方法立即執行transaction,並不是常常會如此需要,除非transaction牽涉到其他的執行續。



沒有留言:

張貼留言