blob: 7b6346c4d6fdaf2f4704c7d5e4121d2a2037b02f [file] [log] [blame]
page.title=Phân đon
parent.title=Hot động
parent.link=activities.html
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Trong tài liu này</h2>
<ol>
<li><a href="#Design">Triết lý Thiết kế</a></li>
<li><a href="#Creating">To mt Phân đon</a>
<ol>
<li><a href="#UI">Thêm mt giao din người dùng</a></li>
<li><a href="#Adding">Thêm mt phân đon vào mt hot động</a></li>
</ol>
</li>
<li><a href="#Managing">Qun lý Phân đon</a></li>
<li><a href="#Transactions">Thc hin Giao tác Phân đon</a></li>
<li><a href="#CommunicatingWithActivity">Giao tiếp vi Hot động</a>
<ol>
<li><a href="#EventCallbacks">To gi li s kin cho hot động</a></li>
<li><a href="#ActionBar">Thêm mc vào Thanh Hành động</a></li>
</ol>
</li>
<li><a href="#Lifecycle">X lý Vòng đời ca Phân đon</a>
<ol>
<li><a href="#CoordinatingWithActivity">Phi hp vi vòng đời ca hot động</a></li>
</ol>
</li>
<li><a href="#Example">Ví dụ</a></li>
</ol>
<h2>Lp khóa</h2>
<ol>
<li>{@link android.app.Fragment}</li>
<li>{@link android.app.FragmentManager}</li>
<li>{@link android.app.FragmentTransaction}</li>
</ol>
<h2>Xem thêm</h2>
<ol>
<li><a href="{@docRoot}training/basics/fragments/index.html">Xây dng mt UI Động bng các Phân đon</a></li>
<li><a href="{@docRoot}guide/practices/tablets-and-handsets.html">H tr Máy tính bng
và Thiết b cm tay</a></li>
</ol>
</div>
</div>
<p>{@link android.app.Fragment} biu din mt hành vi hay mt phn giao din người dùng trong mt
{@link android.app.Activity}. Bn có th kết hp nhiu phân đon trong mt hot động duy nht để xây dng mt
UI nhiu bng và s dng li phân đon trong nhiu hot động. Bn có th coi phân đon như là mt
phn mô-đun ca mt hot động, có vòng đời ca chính nó, nhn các s kin đầu vào ca chính nó, và
bn có th thêm hoc g b trong khi hot động đang chy (kiu như mt "hoạt động con" mà
bn có th s dng li trong các hot động khác nhau).</p>
<p>Phân đon phi luôn được nhúng trong mt hot động và vòng đời ca phân đon b nh hưởng trc tiếp bi
vòng đời ca hot động chủ. Ví dụ, khi hot động b tm dng, tt c
phân đon trong nó cũng vy, và khi hot động b hy, tt c phân đon cũng vy. Tuy nhiên, trong khi mt
hot động đang chy (nó trong trng thái vòng đời <em>được tiếp tc</em><a href="{@docRoot}guide/components/activities.html#Lifecycle"></a>), bạn có thể
thao tác tng phân đon độc lp, chng hn như thêm hay xóa chúng. Khi bn thc hin mt
giao tác phân đon, bn cũng có th thêm nó vào mt ngăn xếp được qun lý bi
hot động đó&mdash;tng mc nhp vào ngăn xếp trong hot động là mt bn ghi giao tác phân đon
đã xy ra. Ngăn xếp cho phép người dùng đảo ngược mt giao tác phân đon iu hướng ngược li),
bng cách nhn nút <em>Quay li</em>.</p>
<p>Khi bn thêm mt phân đon như mt phn trong b trí hot động ca mình, nó s trong mt {@link
android.view.ViewGroup} bên trong phân cp dng xem ca hot động đó và phân đon này s định nghĩa b trí
dng xem ca chính nó.
Bn có th chèn mt phân đon vào b trí hot động ca mình bng cách khai báo phân đon trong tp
b trí ca hot động, dưới dng mt phn t {@code &lt;fragment&gt;}, hoc t mã ng dng ca bn bng cách thêm nó vào mt
{@link android.view.ViewGroup} hin hu. Tuy nhiên, không bt buc phi có mt phân đon là mt b phn ca b trí hot động
; bn cũng có th s dng mt phân đon mà không cn UI ca chính nó như mt trình thc hin vô hình cho hot động
.</p>
<p>Tài liu này mô t cách xây dng ng dng ca bn để s dng phân đon, bao gm
cách các phân đon có th duy trì trng thái ca chúng khi được thêm vào ngăn xếp ca hot động, chia s
các s kin vi hot động và các phân đon khác trong hot động, đóng góp vào thanh hành động ca hot động
và nhiu thông tin khác.</p>
<h2 id="Design">Triết lý Thiết kế</h2>
<p>Android gii thiu phân đon trong phiên bn Android 3.0 (API mc 11), ch yếu nhm h tr
các thiết kế UI động và linh hot hơn trên màn hình ln, chng hn như máy tính bng. Vì
màn hình ca máy tính bng ln hơn nhiu màn hình ca thiết b cm tay, có nhiu khong trng hơn để kết hp và
trao đổi các thành phn UI. Phân đon cho phép nhng thiết kế như vy mà không cn bn phi qun lý nhng thay đổi
phc tp v phân cp dng xem. Bng cách chia b trí ca mt hot động thành các phân đon, bn có th
sa đổi din mo ca hot động vào thi gian chy và gi nhng thay đổi đó trong mt ngăn xếp
được qun lý bi hot động.</p>
<p>Ví dụ, mt ng dng tin tc có th s dng mt phân đon để hin th mt danh sách bài viết
bên trái và mt phân đon khác để hin th mt bài viết bên phi&mdash;c hai phân đon đều xut hin trong mt
hot động, bên cnh nhau, và tng phân đon có tp phương pháp gi li vòng đời riêng và x lý
các s kin nhp liu người dùng riêng ca mình. Vì thế, thay vì s dng mt hot động để chn mt bài viết và mt
hot động khác để đọc bài viết, người dùng có th chn mt bài viết và đọc nó trong cùng
hot động, như được minh ha trong b trí máy tính bng trong hình 1.</p>
<p>Bn nên thiết kế tng phân đon như mt thành phn hot động dng mô-đun và có th s dng li. Đó là bi
mi phân đon s định nghĩa b trí và hành vi ca chính nó vi các phương pháp gi li vòng đời ca chính nó, bn có th
bao gm mt phân đon trong nhiu hot động, vì thế bn nên thiết kế để tái s dng và tránh trc tiếp
thao tác mt phân đon t mt phân đon khác. Điu này đặc bit quan trng vì mt phân đon
mô-đun cho phép bn thay đổi kết hp phân đon ca mình cho các kích c màn hình khác nhau. Khi thiết kế
ng dng ca bn để h tr c máy tính bng và thiết b cm tay, bn có th s dng li phân đon ca mình trong các cu hình
b trí khác nhau nhm ti ưu hóa tri nghim người dùng da trên không gian màn hình có sn. Ví
dụ, trên mt thiết b cm tay, có th cn phi tách riêng các phân đon để cung cp mt UI đơn bng khi mà
không th làm va khít nhiu hơn mt phân đon trong cùng hot động.</p>
<img src="{@docRoot}images/fundamentals/fragments.png" alt="" />
<p class="img-caption"><strong>Hình 1.</strong> Ví d v cách hai mô-đun UI được định nghĩa
bi các phân đon có th được kết hp thành mt hot động đối vi thiết kế máy tính bng, nhưng được tách riêng đối vi
thiết kế thiết b cm tay.</p>
<p>Ví dụ&mdash;để tiếp tc vi ví d v ng dng tin tc&mdash;ứng dng có th nhúng
hai phân đon trong <em>Hot động A</em>, khi đang chy trên mt thiết b có kích c máy tính bng. Tuy nhiên, trên mt
màn hình kích c thiết b cm tay, không có đủ khong trng cho c hai phân đon, vì thế <em>Hot động A</em> ch
bao gm phân đon cho danh sách bài viết, và khi người dùng chn mt bài viết, nó s khi động
<em>Hot động B</em>, hot động này cha phân đon th hai là đọc bài viết. Vì thế, ng dng
h tr c máy tính bng và thiết b cm tay bng cách s dng li các phân đon theo các cách kết hp khác nhau như được minh ha trong
hình 1.</p>
<p>Để biết thêm thông tin v vic thiết kế ng dng ca bn bng các cách kết hp phân đon khác nhau cho
cu hình màn hình khác nhau, hãy xem hướng dn <a href="{@docRoot}guide/practices/tablets-and-handsets.html">H tr Máy tính bng và Thiết b cm tay</a>.</p>
<h2 id="Creating">To mt Phân đon</h2>
<div class="figure" style="width:327px">
<img src="{@docRoot}images/fragment_lifecycle.png" alt="" />
<p class="img-caption"><strong>Hình 2.</strong> Vòng đời ca mt phân đon (trong khi hot động
ca nó đang chy).</p>
</div>
<p>Để to mt phân đon, bn phi to mt lp con ca {@link android.app.Fragment} (hoc
mt lp con hin ti ca nó). Lp {@link android.app.Fragment} có mã trông rt ging
mt {@link android.app.Activity}. Nó cha các phương pháp gi li tương t như hot động, chng
hn như {@link android.app.Fragment#onCreate onCreate()}, {@link android.app.Fragment#onStart onStart()},
{@link android.app.Fragment#onPause onPause()}, và {@link android.app.Fragment#onStop onStop()}. Trên
thc tế, nếu bn đang chuyn đổi mt ng dng Android hin ti để s dng các phân đon, bn có th ch cn di chuyn
mã khi các phương pháp gi li ca hot động ca bn vào các phương pháp gi li tương ng ca phân đon
ca bn.</p>
<p>Thường thì ít nht bn nên trin khai các phương pháp vòng đời sau:</p>
<dl>
<dt>{@link android.app.Fragment#onCreate onCreate()}</dt>
<dd>H thng s gi phương pháp này khi to phân đon. Trong trin khai ca mình, bn nên
khi to các thành phn thiết yếu ca phân đon mà bn mun gi li khi phân đon
b tm dng hoc dng hn, sau đó tiếp tc.</dd>
<dt>{@link android.app.Fragment#onCreateView onCreateView()}</dt>
<dd>H thng s gi phương pháp này khi đến lúc phân đon v giao din người dùng ca nó
ln đầu tiên. Để v mt UI cho phân đon ca mình, bn phi tr v mt {@link android.view.View} t phương pháp
này, đây là gc ca b trí phân đon ca bn. Bn có th tr v giá tr rng nếu phân đon không
cung cp UI.</dd>
<dt>{@link android.app.Activity#onPause onPause()}</dt>
<dd>H thng gi phương pháp này là du hiu đầu tiên v vic người dùng đang ri khi
phân đon (mc dù không phi lúc nào cũng có nghĩa rng phân đon đang b hy). Trường hp này thường là khi bn
định thc hin bt k thay đổi nào vn cn có hiu lc ngoài phiên ca người dùng hin thi (vì
người dùng có th không quay li).</dd>
</dl>
<p>Phn ln ng dng nên trin khai ít nht ba phương pháp sau đối vi mi phân đon, nhưng có mt vài
phương pháp gi li khác mà bn cũng nên s dng để x lý các giai đon khác nhau trong
vòng đời ca phân đon. Tt c phương pháp gi li vòng đời được đề cp chi tiết hơn trong phn
v <a href="#Lifecycle">X lý Vòng đời ca Phân đon</a>.</p>
<p>Cũng có mt vài lp con mà bn có th mun m rng thay vì lp cơ bn {@link
android.app.Fragment}:</p>
<dl>
<dt>{@link android.app.DialogFragment}</dt>
<dd>Hin th mt hp thoi trôi ni. S dng lp này để to mt hp thoi là mt phương án hay cho vic s dng các phương pháp trình tr giúp
hp thoi trong lp {@link android.app.Activity}, vì bn có th
kết hp mt hp thoi phân đon vào ngăn xếp ca các phân đon được qun lý bi hot động,
cho phép người dùng tr v mt phân đon b bỏ.</dd>
<dt>{@link android.app.ListFragment}</dt>
<dd>Hin th mt danh sách các mc được qun lý bi mt trình điu hp (chng hn như mt {@link
android.widget.SimpleCursorAdapter}), tương t như {@link android.app.ListActivity}. Nó cung cp
mt vài phương pháp để qun lý mt dng xem danh sách, chng hn như phương pháp gi li {@link
android.app.ListFragment#onListItemClick(ListView,View,int,long) onListItemClick()} để
x lý các s kin nhp.</dd>
<dt>{@link android.preference.PreferenceFragment}</dt>
<dd>Hin th mt phân cp các đối tượng {@link android.preference.Preference} dưới dng mt danh sách, tương t như
{@link android.preference.PreferenceActivity}. Điu này hu ích khi to mt hot động "thiết đặt"
cho ng dng ca bn.</dd>
</dl>
<h3 id="UI">Thêm mt giao din người dùng</h3>
<p>Phân đon thường được s dng như mt phn giao din người dùng ca hot động và đóng góp b trí ca
chính nó cho hot động.</p>
<p>Để cung cp mt b trí cho mt phân đon, bn phi trin khai phương pháp gi li {@link
android.app.Fragment#onCreateView onCreateView()}, phương pháp này được hệ thống Android gọi
khi đến lúc phân đon v b trí ca nó. Vic bn trin khai phương pháp này phi tr v mt
{@link android.view.View} là phn gc cho b trí phân đon ca bn.</p>
<p class="note"><strong>Lưu ý:</strong> Nếu phân đon ca bn là mt lp con ca {@link
android.app.ListFragment}, trin khai mc định s tr v mt {@link android.widget.ListView} t
{@link android.app.Fragment#onCreateView onCreateView()}, vì thế bạn không cần triển khai nó.</p>
<p>Để tr v mt b trí t {@link
android.app.Fragment#onCreateView onCreateView()}, bạn có thể bung nó từ một <a href="{@docRoot}guide/topics/resources/layout-resource.html">tài nguyên bố trí</a> được định nghĩa trong XML. Để
giúp bn làm vy, {@link android.app.Fragment#onCreateView onCreateView()} cung cấp một đối tượng
{@link android.view.LayoutInflater}.</p>
<p>Ví dụ, sau đây là mt lp con ca {@link android.app.Fragment} vi chc năng np mt b trí t tp
{@code example_fragment.xml}:</p>
<pre>
public static class ExampleFragment extends Fragment {
&#64;Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.example_fragment, container, false);
}
}
</pre>
<div class="sidebox-wrapper">
<div class="sidebox">
<h3>To mt b trí</h3>
<p>Trong ví d trên, {@code R.layout.example_fragment} là mt tham chiếu ti tài nguyên b trí
có tên {@code example_fragment.xml} được lưu trong tài nguyên ng dng. Để biết thông tin v cách
to mt b trí trong XML, hãy xem tài liu <a href="{@docRoot}guide/topics/ui/index.html">Giao din Người dùng</a>
.</p>
</div>
</div>
<p>Tham s {@code container} được chuyn ti {@link android.app.Fragment#onCreateView
onCreateView()} là {@link android.view.ViewGroup} m (tc b trí ca hot động), trong đó
b trí phân đon ca bn
s được chèn vào. Tham s {@code savedInstanceState} là mt {@link android.os.Bundle} có chc năng
cung cp d liu v thc th trước đó ca phân đon, nếu phân đon đang được tiếp tc
(vic khôi phc trng thái được bàn k hơn trong phn v <a href="#Lifecycle">X lý
Vòng đời ca Phân đon</a>).</p>
<p>Phương pháp {@link android.view.LayoutInflater#inflate(int,ViewGroup,boolean) inflate()} có
ba tham đối:</p>
<ul>
<li>ID tài nguyên ca b trí mà bn mun bung.</li>
<li>{@link android.view.ViewGroup} là m ca b trí được bung. Vic chuyn {@code
container} có vai trò quan trng để h thng áp dng các tham s b trí cho dng xem gc ca b trí
được bung, được quy định bi dng xem m là nơi mà nó din ra trong đó.</li>
<li>Mt boolean cho biết b trí được bung có nên được gn vi {@link
android.view.ViewGroup} (tham s th hai) trong khi bung hay không. (Trong trường hp này, điu này là
sai vì h thng đã đang chèn b trí được bung vào {@code
container}&mdash;vic chuyn đúng s to ra mt nhóm dng xem tha trong b trí cui cùng.)</li>
</ul>
<p>Gi bn đã thy cách to mt phân đon nhm cung cp mt b trí. Tiếp theo, bn cn thêm
phân đon vào hot động ca mình.</p>
<h3 id="Adding">Thêm mt phân đon vào mt hot động</h3>
<p>Thường thì mt phân đon đóng góp mt phn UI vào hot động chủ, nó được nhúng như mt phn
trong phân cp dng xem tng th ca hot động. Có hai cách mà bn có th thêm mt phân đon vào b trí
ca hot động:</p>
<ul>
<li><b>Khai báo phân đon bên trong tp b trí ca hot động.</b>
<p>Trong trường hp này, bn có th
ch định các tính cht b trí cho phân đon như th nó là mt dng xem. Ví dụ, sau đây là tp b trí
cho mt hot động có hai phân đon:</p>
<pre>
&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"&gt;
&lt;fragment android:name="com.example.news.ArticleListFragment"
android:id="@+id/list"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" /&gt;
&lt;fragment android:name="com.example.news.ArticleReaderFragment"
android:id="@+id/viewer"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" /&gt;
&lt;/LinearLayout&gt;
</pre>
<p>Thuc tính {@code android:name} trong {@code &lt;fragment&gt;} s ch định lp {@link
android.app.Fragment} để khi to trong b trí.</p>
<p>Khi h thng to b trí hot động này, nó s khi to tng phân đon được ch định trong b trí
và gi ra phương pháp {@link android.app.Fragment#onCreateView onCreateView()} cho từng phân đoạn,
để truy xut b trí ca tng phân đon. H thng s chèn {@link android.view.View} được tr v bi phân đon
trc tiếp thế ch phn t {@code &lt;fragment&gt;}.</p>
<div class="note">
<p><strong>Lưu ý:</strong> Mi phân đon yêu cu mt mã định danh duy nht
mà h thng có th s dng để khôi phc phân đon nếu hot động b khi động li (và bn có th s dng để
nm bt phân đon s thc hin giao tác, chng hn như g b nó). Có ba cách để cung cp ID cho mt
phân đon:</p>
<ul>
<li>Cung cp thuc tính {@code android:id} vi mt ID duy nht.</li>
<li>Cung cp thuc tính {@code android:tag} vi mt xâu duy nht.</li>
<li>Nếu bn không cung cp được thuc tính nào, h thng s s dng ID ca dng xem
ca b cha.</li>
</ul>
</div>
</li>
<li><b>Hoc, bng cách lp trình, thêm phân đon vào mt {@link android.view.ViewGroup} hin hu.</b>
<p>Vào bt c lúc nào trong khi hot động ca bn đang chy, bn có th thêm phân đon vào b trí hot động ca mình. Bn
ch cn ch định mt {@link
android.view.ViewGroup} là nơi mà bn s đặt phân đon vào.</p>
<p>Để thc hin giao tác phân đon trong hot động ca mình (chng hn như thêm, g bỏ, hay thay thế mt
phân đon), bn phi s dng các API t {@link android.app.FragmentTransaction}. Bn có th nhn mt thc th
ca {@link android.app.FragmentTransaction} t {@link android.app.Activity} ca mình như sau:</p>
<pre>
FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()}
FragmentTransaction fragmentTransaction = fragmentManager.{@link android.app.FragmentManager#beginTransaction()};
</pre>
<p>Sau đó, bn có th thêm mt phân đon bng cách s dng phương pháp {@link
android.app.FragmentTransaction#add(int,Fragment) add()}, chỉ định phân đoạn sẽ thêm và
dng xem mà bn s chèn nó vào. Ví dụ:</p>
<pre>
ExampleFragment fragment = new ExampleFragment();
fragmentTransaction.add(R.id.fragment_container, fragment);
fragmentTransaction.commit();
</pre>
<p>Tham đối đầu tiên được chuyn cho {@link android.app.FragmentTransaction#add(int,Fragment) add()}
là {@link android.view.ViewGroup}, là nơi mà phân đon s được đặt vào, được ch định bi
ID tài nguyên, và tham đối th hai là phân đon cn thêm.</p>
<p>Sau khi bn đã thc hin các thay đổi ca mình bng
{@link android.app.FragmentTransaction}, bn phi
gi {@link android.app.FragmentTransaction#commit} để các thay đổi có hiệu lực.</p>
</li>
</ul>
<h4 id="AddingWithoutUI">Thêm mt phân đon không có UI</h4>
<p>Các ví d nêu trên cho biết cách thêm mt phân đon vào hot động ca bn để cung cp mt UI. Tuy nhiên,
bn cũng có th s dng mt phân đon để cung cp mt hành vi chy ngm cho hot động mà không cn đưa
UI b sung.</p>
<p>Để thêm mt phân đon không có UI, hãy thêm phân đon t hot động đang bng cách s dng {@link
android.app.FragmentTransaction#add(Fragment,String)} (cung cấp một "tag" xâu duy nhất cho phân đoạn
, thay vì mt ID dng xem). Làm vy s thêm phân đon, nhưng vì không liên kết vi mt dng xem
trong b trí hot động, nó s không nhn được lnh gi ti {@link
android.app.Fragment#onCreateView onCreateView()}. Vì thế, bạn không cần triển khai phương pháp đó.</p>
<p>Vic cung cp tag xâu cho phân đon không ch áp dng cho các phân đon không có UI&mdash;bn cũng có th
cung cp tag xâu cho phân đon có UI&mdash;nhưng nếu phân đon không có
UI, khi đó, tag xâu là cách duy nht để nhn biết nó. Nếu sau này bn mun nhn phân đon t
hot động, bn cn s dng {@link android.app.FragmentManager#findFragmentByTag
findFragmentByTag()}.</p>
<p>Để biết ví d v hot động s dng phân đon như mt trình thc hin nn, không có UI, hãy xem mu {@code
FragmentRetainInstance.java}, mu này có trong các mu SDK (có sn thông qua
Trình qun lý SDK Android) và nm trên h thng ca bn như là
<code>&lt;sdk_root&gt;/APIDemos/app/src/main/java/com/example/android/apis/app/FragmentRetainInstance.java</code>.</p>
<h2 id="Managing">Qun lý Phân đon</h2>
<p>Để qun lý các phân đon trong hot động ca mình, bn cn s dng {@link android.app.FragmentManager}. Để
có nó, hãy gi {@link android.app.Activity#getFragmentManager()} từ hoạt động của bạn.</p>
<p>Mt s vic bn có th làm vi {@link android.app.FragmentManager} bao gm:</p>
<ul>
<li>Nhn các phân đon tn ti trong hot động, bng {@link
android.app.FragmentManager#findFragmentById findFragmentById()} (đối với các phân đoạn cung cấp UI trong
b trí hot động) hoc {@link android.app.FragmentManager#findFragmentByTag
findFragmentByTag()} (đối vi các phân đon có hoc không cung cp UI).</li>
<li>Ly phân đon ra khi ngăn xếp, bng {@link
android.app.FragmentManager#popBackStack()} (mô phỏng một câu lệnh <em>Quay lại</em> của người dùng).</li>
<li>Đăng ký mt đối tượng theo dõi cho nhng thay đổi đối vi ngăn xếp, bng {@link
android.app.FragmentManager#addOnBackStackChangedListener addOnBackStackChangedListener()}.</li>
</ul>
<p>Để biết thêm thông tin v nhng phương pháp này và phương pháp khác, hãy tham kho tài liu lp {@link
android.app.FragmentManager}.</p>
<p>Như minh ha trong phn trước, bn cũng có th s dng {@link android.app.FragmentManager}
để m mt {@link android.app.FragmentTransaction}, nó cho phép bn thc hin các giao tác, ví d như
thêm hoc g b phân đon.</p>
<h2 id="Transactions">Thc hin Giao tác Phân đon</h2>
<p>Mt tính năng tuyt vi khi s dng phân đon trong hot động ca bn đó là kh năng thêm, g bỏ, thay thế,
và thc hin các hành động khác vi chúng, để hi đáp li tương tác ca người dùng. Mi tp hp thay đổi mà bn
thc thi cho hot động được gi là mt giao tác và bn có th thc hin mt giao tác bng cách s dng các API trong {@link
android.app.FragmentTransaction}. Bn cũng có th lưu tng giao tác vào mt ngăn xếp được qun lý bi
hot động, cho phép người dùng điu hướng ngược li thông qua nhng thay đổi phân đon (tương t như điu hướng
ngược li thông qua hot động).</p>
<p>Bn có th thu được mt thc th ca {@link android.app.FragmentTransaction} t {@link
android.app.FragmentManager} như sau:</p>
<pre>
FragmentManager fragmentManager = {@link android.app.Activity#getFragmentManager()};
FragmentTransaction fragmentTransaction = fragmentManager.{@link android.app.FragmentManager#beginTransaction()};
</pre>
<p>Mi giao tác là mt tp hp nhng thay đổi mà bn mun thc hin ti cùng thi đim. Bn có th thiết lp
tt c thay đổi mà mình mun thc hin đối vi mt giao tác cho trước bng cách s dng các phương pháp như {@link
android.app.FragmentTransaction#add add()}, {@link android.app.FragmentTransaction#remove remove()},
và {@link android.app.FragmentTransaction#replace replace()}. Sau đó, để áp dụng giao tác
cho hot động, bn phi gi {@link android.app.FragmentTransaction#commit()}.</p>
</dl>
<p>Trước khi bn gi {@link
android.app.FragmentTransaction#commit()}, tuy nhiên, bạn có thể muốn gọi {@link
android.app.FragmentTransaction#addToBackStack addToBackStack()}, để thêm giao tác
vào mt ngăn xếp ca các giao tác phân đon. Ngăn xếp này được qun lý bi hot động và cho phép
người dùng tr v trng thái phân đon trước đó, bng cách nhp nút <em>Quay li</em>.</p>
<p>Ví dụ, sau đây là cách bn có th thay thế phân đon này bng phân đon khác, và gi nguyên
trng thái trước đó ca ngăn xếp:</p>
<pre>
// 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();
</pre>
<p>Trong ví d này, {@code newFragment} thay thế mi phân đon (nếu có) hin đang trong
b cha b trí được nhn biết bi ID {@code R.id.fragment_container}. Bng cách gi {@link
android.app.FragmentTransaction#addToBackStack addToBackStack()}, giao tác thay thế
được lưu vào ngăn xếp, vì thế người dùng có th đảo ngược giao tác và mang
giao tác trước đó tr li bng cách nhn nút <em>Quay li</em>.</p>
<p>Nếu bn thêm nhiu thay đổi vào giao tác (chng hn như mt {@link
android.app.FragmentTransaction#add add()} khác hoặc {@link android.app.FragmentTransaction#remove
remove()}) và gi {@link
android.app.FragmentTransaction#addToBackStack addToBackStack()}, khi đó, tất cả thay đổi được áp dụng
trước khi bn gi {@link android.app.FragmentTransaction#commit commit()} đều được thêm vào
ngăn xếp như mt giao tác riêng l và nút <em>Quay li</em> sẽ đảo ngược tất cả cùng nhau.</p>
<p>Th t mà bn thêm thay đổi vào mt {@link android.app.FragmentTransaction} không quan trng,
ngoi trừ:</p>
<ul>
<li>Bn phi gi {@link android.app.FragmentTransaction#commit()} cuối cùng</li>
<li>Nếu bn thêm nhiu phân đon vào cùng b cha, khi đó th t mà
bn thêm chúng s xác định th t chúng xut hin trong phân cp dng xem</li>
</ul>
<p>Nếu bn không gi {@link android.app.FragmentTransaction#addToBackStack(String)
addToBackStack()} khi thc hin mt giao tác để xóa mt phân đon, khi đó, phân đon đó s b
hy khi giao tác được thc hin và người dùng không th điu hướng tr li nó. Trong khi đó, nếu bn
gi {@link android.app.FragmentTransaction#addToBackStack(String) addToBackStack()} khi
g b mt phân đon, khi đó phân đon b <em>dng</em> và s được khôi phc nếu người dùng điu hướng
tr li.</p>
<p class="note"><strong>Mo:</strong> Vi mi giao tác phân đon, bn có th áp dng mt hot nh
chuyn tiếp bng cách gi {@link android.app.FragmentTransaction#setTransition setTransition()} trước khi
thc thi.</p>
<p>Vic gi {@link android.app.FragmentTransaction#commit()} không thực hiện giao tác
ngay lp tc. Thay vào đó, nó lp lch biu để chy trên lung UI ca hot động (lung "chính") ngay khi
lung có th làm vy. Tuy nhiên, nếu cn, bn có th gi {@link
android.app.FragmentManager#executePendingTransactions()} từ luồng UI của mình để ngay lập tức thực hiện
các giao tác được gi bi {@link android.app.FragmentTransaction#commit()}. Làm vậy
thường không cn thiết tr khi giao tác đó là ph thuc cho các tác v nhng lung khác.</p>
<p class="caution"><strong>Chú ý:</strong> Bn có th thc thi mt giao tác bng cách s dng {@link
android.app.FragmentTransaction#commit commit()} chỉ trước khi hoạt động <a href="{@docRoot}guide/components/activities.html#SavingActivityState">lưu
trng thái</a> ca nó (khi người dùng ri khi hot động). Nếu bn định thc thi sau thi đim đó s phát sinh mt li
ngoi lệ. Nguyên nhân là vì trng thái sau khi thc thi có th b mt nếu hot động
cn được khôi phc. Đối vi nhng trường hp mà bn có th mt thc thi, hãy s dng {@link
android.app.FragmentTransaction#commitAllowingStateLoss()}.</p>
<h2 id="CommunicatingWithActivity">Giao tiếp vi Hot động</h2>
<p>Mc dù {@link android.app.Fragment} được trin khai như mt đối tượng độc lp vi
{@link android.app.Activity} và có th được s dng bên trong nhiu hot động, mt thc th đã cho ca
phân đon s được gn kết trc tiếp vi hot động cha nó.</p>
<p>C thể, phân đon có th truy cp thc th {@link android.app.Activity} bng {@link
android.app.Fragment#getActivity()} và dễ dàng thực hiện các tác vụ như tìm một dạng xem trong bố trí
hot động:</p>
<pre>
View listView = {@link android.app.Fragment#getActivity()}.{@link android.app.Activity#findViewById findViewById}(R.id.list);
</pre>
<p>Tương tự, hot động ca bn có th gi ra các phương pháp trong phân đon bng cách thu được mt tham chiếu ti
{@link android.app.Fragment} t {@link android.app.FragmentManager}, bng cách s dng {@link
android.app.FragmentManager#findFragmentById findFragmentById()} hoặc {@link
android.app.FragmentManager#findFragmentByTag findFragmentByTag()}. Ví dụ:</p>
<pre>
ExampleFragment fragment = (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment);
</pre>
<h3 id="EventCallbacks">To gi li s kin cho hot động</h3>
<p>Trong mt s trường hp, bn có th cn mt phân đon để chia s s kin vi hot động. Mt cách hay để làm điu này
đó là định nghĩa mt giao din gi li bên trong phân đon và yêu cu hot động ch trin khai
nó. Khi hot động nhn được mt lnh gi li thông qua giao din, nó có th chia s thông tin vi
các phân đon khác trong b trí nếu cn.</p>
<p>Ví dụ, nếu mt ng dng tin tc có hai phân đon trong mt hot động&mdash;mt để hin th danh sách
bài viết (phân đon A) và mt để hin th mt bài viết (phân đon B)&mdash;khi đó, phân đon A phi thông báo vi
hot động khi nào thì mt mc danh sách được chn để nó có th yêu cu phân đon B hin th bài viết đó. Trong
trường hp này, giao din {@code OnArticleSelectedListener} s được khai báo bên trong phân đon A:</p>
<pre>
public static class FragmentA extends ListFragment {
...
// Container Activity must implement this interface
public interface OnArticleSelectedListener {
public void onArticleSelected(Uri articleUri);
}
...
}
</pre>
<p>Khi đó, hot động lưu tr phân đon s trin khai giao din {@code OnArticleSelectedListener}
và
khng chế {@code onArticleSelected()} để thông báo vi phân đon B v s kin t phân đon A. Để đảm bo
rng hot động ch trin khai giao din này, phương pháp gi li {@link
android.app.Fragment#onAttach onAttach()} của phân đoạn A (mà hệ thống gọi khi thêm
phân đon vào hot động) s khi to mt thc th ca {@code OnArticleSelectedListener} bng cách
đổi kiu {@link android.app.Activity} mà được chuyn vào {@link android.app.Fragment#onAttach
onAttach()}:</p>
<pre>
public static class FragmentA extends ListFragment {
OnArticleSelectedListener mListener;
...
&#64;Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnArticleSelectedListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
}
}
...
}
</pre>
<p>Nếu hot động chưa trin khai giao din, khi đó phân đon s đưa ra li
{@link java.lang.ClassCastException}.
Nếu thành công, thành viên {@code mListener} gi mt tham chiếu ti trin khai
{@code OnArticleSelectedListener}ca hot động, sao cho phân đon A có th chia s s kin vi hot động bng cách gi các phương pháp
được định nghĩa bi giao din {@code OnArticleSelectedListener}. Ví dụ, nếu phân đon A là mt
phn m rng ca {@link android.app.ListFragment}, mi ln
người dùng nhp vào mt mc danh sách, h thng s gi ra {@link android.app.ListFragment#onListItemClick
onListItemClick()} trong phân đon, và nó li gi {@code onArticleSelected()} để chia s
s kin vi hot động:</p>
<pre>
public static class FragmentA extends ListFragment {
OnArticleSelectedListener mListener;
...
&#64;Override
public void onListItemClick(ListView l, View v, int position, long id) {
// Append the clicked item's row ID with the content provider Uri
Uri noteUri = ContentUris.{@link android.content.ContentUris#withAppendedId withAppendedId}(ArticleColumns.CONTENT_URI, id);
// Send the event and Uri to the host activity
mListener.onArticleSelected(noteUri);
}
...
}
</pre>
<p>Tham s {@code id} được chuyn vào {@link
android.app.ListFragment#onListItemClick onListItemClick()} là ID hàng của mục được nhấp,
nó được s dng bi hot động (hoc phân đon kia) để ti bài viết t {@link
android.content.ContentProvider} ca ng dng.</p>
<p><!--To see a complete implementation of this kind of callback interface, see the <a
href="{@docRoot}resources/samples/NotePad/index.html">NotePad sample</a>. -->Bn có th xem thêm thông tin v
cách s dng mt trình cung cp ni dung trong tài liu <a href="{@docRoot}guide/topics/providers/content-providers.html">Trình cung cp Ni dung</a>.</p>
<h3 id="ActionBar">Thêm mc vào Thanh Hành động</h3>
<p>Phân đon ca bn có th đóng góp các mc menu vào <a href="{@docRoot}guide/topics/ui/menus.html#options-menu">Menu Tùy chn</a> của hoạt động (và tiếp đó là cả <a href="{@docRoot}guide/topics/ui/actionbar.html">Thanh Hành động</a>) bằng cách triển khai
{@link android.app.Fragment#onCreateOptionsMenu(Menu,MenuInflater) onCreateOptionsMenu()}. Tuy nhiên, để
phương pháp này nhận lệnh gọi, bạn phải gọi {@link
android.app.Fragment#setHasOptionsMenu(boolean) setHasOptionsMenu()} trong khi {@link
android.app.Fragment#onCreate(Bundle) onCreate()}, để cho biết rằng phân đoạn
sẽ muốn thêm mục vào Menu Tùy chọn (nếu không, phân đoạn sẽ không nhận được lệnh gọi tới
{@link android.app.Fragment#onCreateOptionsMenu onCreateOptionsMenu()}).</p>
<p>Bất kỳ mục nào mà bạn thêm vào Menu Tùy chọn sau đó từ phân đoạn đều được nối với các mục menu
hiện tại. Phân đoạn cũng nhận các lệnh gọi lại tới {@link
android.app.Fragment#onOptionsItemSelected(MenuItem) onOptionsItemSelected()} khi một mục menu
được chọn.</p>
<p>Bạn cũng có thể đăng ký một dạng xem trong bố trí phân đoạn của mình để cung cấp một menu ngữ cảnh bằng cách gọi {@link
android.app.Fragment#registerForContextMenu(View) registerForContextMenu()}. Khi người dùng mở
menu ngữ cảnh, phân đoạn nhận một lệnh gọi tới {@link
android.app.Fragment#onCreateContextMenu(ContextMenu,View,ContextMenu.ContextMenuInfo)
onCreateContextMenu()}. Khi người dùng chọn một mục, phân đoạn nhận được một lệnh gọi tới {@link
android.app.Fragment#onContextItemSelected(MenuItem) onContextItemSelected()}.</p>
<p class="note"><strong>Lưu ý:</strong> Mặc dù phân đoạn của bạn nhận được một lệnh gọi khi chọn mục
đối với từng mục menu mà nó thêm, trước tiên hoạt động sẽ nhận phương pháp gọi lại tương ứng khi người dùng
chọn một mục menu. Nếu việc triển khai gọi lại khi chọn mục của hoạt động không
xử lý mục được chọn, khi đó sự kiện được chuyển sang phương pháp gọi lại của phân đoạn. Điều này đúng đối với
Menu Tùy chọn và các menu ngữ cảnh.</p>
<p>Để biết thêm thông tin về các menu, xem các hướng dẫn cho nhà phát triển <a href="{@docRoot}guide/topics/ui/menus.html">Menu</a> và <a href="{@docRoot}guide/topics/ui/actionbar.html">Thanh Hành động</a>.</p>
<h2 id="Lifecycle">Xử lý Vòng đời của Phân đoạn</h2>
<div class="figure" style="width:350px">
<img src="{@docRoot}images/activity_fragment_lifecycle.png" alt="" />
<p class="img-caption"><strong>Hình 3.</strong> Ảnh hưởng của vòng đời hoạt động tới vòng đời
của phân đoạn.</p>
</div>
<p>Việc quản lý vòng đời của một phân đoạn rất giống với quản lý vòng đời của một hoạt động. Giống như
hoạt động, phân đoạn có thể tồn tại ở ba trạng thái:</p>
<dl>
<dt><i>Tiếp tục</i></dt>
<dd>Phân đoạn hiển thị trong hoạt động đang chạy.</dd>
<dt><i>Tạm dừng</i></dt>
<dd>Một hoạt động khác ở trong tiền cảnh và có tiêu điểm, nhưng hoạt động mà phân đoạn
này nằm trong vẫn hiển thị (hoạt động tiền cảnh mờ một phần hoặc không
che phủ toàn bộ màn hình).</dd>
<dt><i>Dừng</i></dt>
<dd>Phân đoạn không hiển thị. Hoặc là hoạt động chủ đã bị dừng hoặc
phân đoạn đã được gỡ bỏ khỏi hoạt động, nhưng được thêm vào ngăn xếp. Phân đoạn dừng
vẫn còn hoạt động (tất cả thông tin về trạng thái và thành viên đều được hệ thống giữ lại). Tuy nhiên, nó không còn
hiển thị với người dùng nữa và sẽ bị tắt bỏ nếu hoạt động bị tắt bỏ.</dd>
</dl>
<p>Cũng như một hoạt động, bạn có thể giữ lại trạng thái của một phân đoạn bằng cách sử dụng {@link
android.os.Bundle}, trong trường hợp tiến trình của hoạt động bị tắt bỏ và bạn cần khôi phục
trạng thái của phân đoạn khi hoạt động được tạo lại. Bạn có thể lưu trạng thái trong phương pháp gọi lại {@link
android.app.Fragment#onSaveInstanceState onSaveInstanceState()} của phân đoạn và khôi phục nó trong
hoặc {@link android.app.Fragment#onCreate onCreate()}, {@link
android.app.Fragment#onCreateView onCreateView()}, hoặc {@link
android.app.Fragment#onActivityCreated onActivityCreated()}. Để biết thêm thông tin về việc lưu
trạng thái, xem tài liệu <a href="{@docRoot}guide/components/activities.html#SavingActivityState">Hoạt động</a>
.</p>
<p>S khác nhau quan trng nht trong vòng đời gia mt hot động và mt phân đon đó là cách chúng
được lưu tr trong ngăn xếp tương ng. Hot động được đặt vào mt ngăn xếp gm nhiu hot động
, được qun lý bi h thng theo mc định khi b dng (sao cho người dùng có th điu hướng li
nó bng nút <em>Quay li</em> như được đề cập trong <a href="{@docRoot}guide/components/tasks-and-back-stack.html">Tác vụ và Ngăn xếp</a>).
Tuy nhiên, phân đoạn chỉ được đặt vào một ngăn xếp do hoạt động chủ quản lý khi bạn
yêu cầu rõ ràng rằng trường hợp đó phải được lưu bằng cách gọi {@link
android.app.FragmentTransaction#addToBackStack(String) addToBackStack()} trong một giao tác
gỡ bỏ phân đoạn.</p>
<p>Nếu không thì việc quản lý vòng đời của phân đoạn rất giống với việc quản lý vòng đời
của hoạt động. Vì thế, những nội dung áp dụng cho <a href="{@docRoot}guide/components/activities.html#Lifecycle">quản lý vòng đời của
hot động</a> cũng áp dng cho phân đon. Tuy nhiên, vic mà bn cũng cn phi hiu đó là cách
vòng đời ca hot động nh hưởng ti vòng đời ca phân đon.</p>
<p class="caution"><strong>Chú ý:</strong> Nếu bn cn mt đối tượng {@link android.content.Context} trong
{@link android.app.Fragment}ca mình, bn có th gi {@link android.app.Fragment#getActivity()}.
Tuy nhiên, nh ch được gi {@link android.app.Fragment#getActivity()} khi phân đoạn được gắn với
mt hot động. Khi phân đon chưa được gn, hoc b g trong khi kết thúc
vòng đời ca nó, {@link android.app.Fragment#getActivity()} sẽ trả về rỗng.</p>
<h3 id="CoordinatingWithActivity">Phi hp vi vòng đời ca hot động</h3>
<p>Vòng đời ca hot động mà phân đon có trong đó s trc tiếp nh hưởng ti vòng đời ca phân đon
, sao cho mi lnh gi li vòng đời cho hot động đó s dn ti mt lnh gi li tương t cho tng
phân đon. Ví dụ, khi hot động nhn được {@link android.app.Activity#onPause}, mỗi
phân đon trong hot động s nhn được {@link android.app.Fragment#onPause}.</p>
<p>Tuy nhiên, các phân đon có thêm mt vài lnh gi li vòng đời nhm x lý tương tác duy nht vi
hot động để thc hin các hành động như xây dng và hy UI ca phân đon. Nhng phương pháp gi li
b sung này là:</p>
<dl>
<dt>{@link android.app.Fragment#onAttach onAttach()}</dt>
<dd>Được gi khi phân đon đã được liên kết vi hot động {@link
android.app.Activity} được chuyn đây).</dd>
<dt>{@link android.app.Fragment#onCreateView onCreateView()}</dt>
<dd>Được gi khi to phân cp dng xem được liên kết vi phân đon.</dd>
<dt>{@link android.app.Fragment#onActivityCreated onActivityCreated()}</dt>
<dd>Được gi khi phương pháp {@link android.app.Activity#onCreate
onCreate()} ca hot động đã tr về.</dd>
<dt>{@link android.app.Fragment#onDestroyView onDestroyView()}</dt>
<dd>Được gi khi phân cp dng xem được liên kết vi phân đon đang được g bỏ.</dd>
<dt>{@link android.app.Fragment#onDetach onDetach()}</dt>
<dd>Được gi khi phân đon đang được b liên kết khi hot động.</dd>
</dl>
<p>Tiến trình vòng đời ca mt phân đon, do b nh hưởng bi hot động ch ca nó, được minh ha
bi hình 3. Trong hình này, bn có th thy cách thc mi trng thái ni tiếp nhau ca hot động s xác định
các phương pháp gi li nào mà mt phân đon có th nhn được. Ví dụ, khi hot động đã nhn được lnh gi li {@link
android.app.Activity#onCreate onCreate()} của nó, phân đoạn trong hoạt động sẽ nhận được không quá
lnh gi li {@link android.app.Fragment#onActivityCreated onActivityCreated()}.</p>
<p>Sau khi hot động đạt trng thái tiếp tc, bn có th t do thêm và g b phân đon vào
hot động. Vì thế, ch trong khi hot động trng thái tiếp tc thì vòng đời ca mt phân đon
mi có th thay đổi độc lp.</p>
<p>Tuy nhiên, khi hot động ri khi trng thái tiếp tc, phân đon li b hot động đẩy qua vòng đời
ca mình.</p>
<h2 id="Example">Ví dụ</h2>
<p>Để kết hp mi ni dung được đề cp trong tài liu này, sau đây là mt ví d v hot động
s dng hai phân đon để to mt b trí hai bng. Hot động bên dưới bao gm mt phân đon để
hin th danh sách các v kch ca Shakespeare và mt phân đon khác để hin th tóm tt v v kch khi được chn
t danh sách. Nó cũng minh ha cách cung cp các cu hình phân đon khác nhau,
da trên cu hình màn hình.</p>
<p class="note"><strong>Lưu ý:</strong> Mã ngun hoàn chnh cho hot động này có sn trong
<a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.html">{@code
FragmentLayout.java}</a>.</p>
<p>Hot động chính áp dng mt b trí theo cách thông thường, trong {@link
android.app.Activity#onCreate onCreate()}:</p>
{@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java main}
<p>B trí được áp dng là {@code fragment_layout.xml}:</p>
{@sample development/samples/ApiDemos/res/layout-land/fragment_layout.xml layout}
<p>Khi s dng b trí này, h thng s khi to {@code TitlesFragment} (lit kê tên
các v kch) ngay khi hot động np b trí, trong khi {@link android.widget.FrameLayout}
(nơi s xut hin phân đon hin th tóm tt v v kch) chiếm khong trng phía bên phi ca
màn hình, nhưng ban đầu vn trng. Như bn s thy bên dưới, mãi ti khi người dùng chn mt mc
t danh sách thì mt phân đon mi được đặt vào {@link android.widget.FrameLayout}.</p>
<p>Tuy nhiên, không phi tt c cu hình màn hình đều đủ rng để hin th c danh sách
các v kch và tóm tt bên cnh nhau. Vì thế, b trí trên ch được s dng cho cu hình
màn hình kh ngang bng cách lưu nó dưới dng {@code res/layout-land/fragment_layout.xml}.</p>
<p>Vì thế, khi màn hình hướng đứng, h thng s áp dng b trí sau, nó
được lưu ti {@code res/layout/fragment_layout.xml}:</p>
{@sample development/samples/ApiDemos/res/layout/fragment_layout.xml layout}
<p>B trí này ch bao gm {@code TitlesFragment}. Điu này có nghĩa là, khi thiết b
hướng đứng, ch danh sách tên v kch được hin thị. Vì thế, khi người dùng nhp vào mt
mc danh sách trong cu hình này, ng dng s bt đầu mt hot động mi để hin th tóm tt,
thay vì ti mt phân đon th hai.</p>
<p>Tiếp theo, bn có th thy cách hoàn thành điu này trong các lp phân đon. Đầu tiên là {@code
TitlesFragment}, hin th danh sách tên các v kch ca Shakespeare. Phân đon này s m rng {@link
android.app.ListFragment} và da vào nó để x lý hu hết công vic v dng xem danh sách.</p>
<p>Khi bn kim tra đon mã này, hãy để ý rng có hai hành vi có th khi người dùng nhp vào mt
mc danh sách: ph thuc vào b trí nào trong hai b trí đang hin hot, nó có th hoc to và hin th mt phân đon
mi để hin th chi tiết trong cùng hot động (thêm phân đon vào {@link
android.widget.FrameLayout}), hoc bt đầu mt hot động mi (ti đó phân đon có th được hin thị).</p>
{@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java titles}
<p>Phân đon th hai, {@code DetailsFragment} s hin th tóm tt v kch cho mc được chn t
danh sách trong {@code TitlesFragment}:</p>
{@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java details}
<p>Nh li lp {@code TitlesFragment} rng, nếu người dùng nhp vào mt mc danh sách và b trí
hin ti <em>không</em> có dng xem {@code R.id.details} (là nơi mà
{@code DetailsFragment} thuc về), khi đó, ng dng s bt đầu hot động {@code DetailsActivity}
để hin th ni dung ca mc đó.</p>
<p>Sau đây là {@code DetailsActivity}, nó ch đơn thun nhúng {@code DetailsFragment} để hin th
tóm tt v kch được chn khi màn hình hướng đứng:</p>
{@sample development/samples/ApiDemos/src/com/example/android/apis/app/FragmentLayout.java
details_activity}
<p>Lưu ý rng hot động này t kết thúc nếu cu hình là kh ngang, sao cho hot động
chính có th chiếm ly và hin th {@code DetailsFragment} bên cnh {@code TitlesFragment}.
Điu này có th xy ra nếu người dùng bt đầu {@code DetailsActivity} dng hướng đứng, nhưng
sau đó xoay thành kh ngang (làm vy s bt đầu li hot động hin ti).</p>
<p>Để biết thêm mu s dng phân đon (và toàn b tp ngun cho ví d này),
hãy xem ng dng mu API Demos có sn trong <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/index.html#Fragment">
ApiDemos</a> (có thể tải xuống từ <a href="{@docRoot}resources/samples/get.html">Thành phần SDK Mẫu</a>).</p>