1page.title=詳細ビューをビルドする
2page.tags=tv, detailsfragment
3
4trainingnavtop=true
5
6@jd:body
7
8<div id="tb-wrapper">
9<div id="tb">
10  <h2>学習の目的</h2>
11  <ol>
12    <li><a href="#details-presenter">詳細プレゼンターをビルドする</a></li>
13    <li><a href="#details-fragment">詳細フラグメントを拡張する</a>
14    <li><a href="#activity">詳細アクティビティを作成する</a></li>
15    <li><a href="#item-listener">クリックされたアイテムのリスナを定義する</a></li>
16  </ol>
17</div>
18</div>
19
20<p>
21  <a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 leanback サポート ライブラリ</a> が提供するメディア ブラウジング インターフェース クラスには、説明やレビューなどのメディア アイテムに関する追加情報を表示したり、アイテムの購入やコンテンツの再生など、アイテムに対するアクションを取ったりするためのクラスが含まれます。
22</p>
23
24<p>
25  このレッスンでは、メディア アイテムの詳細に関するプレゼンター クラスを作成したり、{@link android.support.v17.leanback.app.DetailsFragment} クラスを拡張して、ユーザーがメディア アイテムを選択した場合に表示する詳細ビューを実装したりする方法を説明します。
26</p>
27
28<p class="note">
29  <strong>注意:</strong>次の実装例では、追加的なアクティビティを使用して {@link android.support.v17.leanback.app.DetailsFragment} を含めています。ただし、フラグメント トランザクションを使用すると、現在の {@link android.support.v17.leanback.app.BrowseFragment} を<em>同じ</em>アクティビティにある {@link android.support.v17.leanback.app.DetailsFragment} で置き換えることにより、2 つ目のアクティビティの作成を回避できます。フラグメント トランザクションの使用については、<a href="{@docRoot}training/basics/fragments/fragment-ui.html#Replace">フラグメントを使用したダイナミックな UI のビルド</a>を参照してください。
30</p>
31
32
33<h2 id="details-presenter">詳細プレゼンターをビルドする</h2>
34
35<p>
36  Leanback ライブラリが提供するメディア ブラウジングのフレームワークでは、プレゼンター オブジェクトを使用して、メディア アイテムの詳細を含むスクリーン上のデータ表示を制御します。このメディア アイテムの詳細に関するプレゼンターのほぼ完全な実装を目的に、フレームワークでは{@link android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter} クラスを提供しています。これにより、次のコード サンプルのように、{@link android.support.v17.leanback.widget.AbstractDetailsDescriptionPresenter#onBindDescription onBindDescription()} メソッドを実装して、ビュー フィールドをデータ オブジェクトにバインドするだけでよくなります。
37</p>
38
39<pre>
40public class DetailsDescriptionPresenter
41        extends AbstractDetailsDescriptionPresenter {
42
43    &#64;Override
44    protected void onBindDescription(ViewHolder viewHolder, Object itemData) {
45        MyMediaItemDetails details = (MyMediaItemDetails) itemData;
46        // In a production app, the itemData object contains the information
47        // needed to display details for the media item:
48        // viewHolder.getTitle().setText(details.getShortTitle());
49
50        // Here we provide static data for testing purposes:
51        viewHolder.getTitle().setText(itemData.toString());
52        viewHolder.getSubtitle().setText("2014   Drama   TV-14");
53        viewHolder.getBody().setText("Lorem ipsum dolor sit amet, consectetur "
54                + "adipisicing elit, sed do eiusmod tempor incididunt ut labore "
55                + " et dolore magna aliqua. Ut enim ad minim veniam, quis "
56                + "nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
57                + "commodo consequat.");
58    }
59}
60</pre>
61
62
63<h2 id="details-fragment">詳細フラグメントを拡張する</h2>
64
65<p>
66  メディア アイテムの詳細を表示するために {@link android.support.v17.leanback.app.DetailsFragment} クラスを使用する場合、そのクラスを拡張すると、メディア アイテムのプレビュー画像やアクションなどの追加コンテンツを提供できます。関連するメディア アイテムのリストといった追加コンテンツも提供できます。
67</p>
68
69<p>
70  次のコード例では、前のセクションで説明したプレゼンター クラスを使用して、表示中のメディア アイテムのプレビュー画像やアクションを追加する方法を示しています。この例では、詳細リストの下に表示される関連するメディア アイテムの行も追加しています。
71</p>
72
73<pre>
74public class MediaItemDetailsFragment extends DetailsFragment {
75    private static final String TAG = "MediaItemDetailsFragment";
76    private ArrayObjectAdapter mRowsAdapter;
77
78    &#64;Override
79    public void onCreate(Bundle savedInstanceState) {
80        Log.i(TAG, "onCreate");
81        super.onCreate(savedInstanceState);
82
83        buildDetails();
84    }
85
86    private void buildDetails() {
87        ClassPresenterSelector selector = new ClassPresenterSelector();
88        // Attach your media item details presenter to the row presenter:
89        DetailsOverviewRowPresenter rowPresenter =
90            new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
91
92        selector.addClassPresenter(DetailsOverviewRow.class, rowPresenter);
93        selector.addClassPresenter(ListRow.class,
94                new ListRowPresenter());
95        mRowsAdapter = new ArrayObjectAdapter(selector);
96
97        Resources res = getActivity().getResources();
98        DetailsOverviewRow detailsOverview = new DetailsOverviewRow(
99                "Media Item Details");
100
101        // Add images and action buttons to the details view
102        detailsOverview.setImageDrawable(res.getDrawable(R.drawable.jelly_beans));
103        detailsOverview.addAction(new Action(1, "Buy $9.99"));
104        detailsOverview.addAction(new Action(2, "Rent $2.99"));
105        mRowsAdapter.add(detailsOverview);
106
107        // Add a Related items row
108        ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(
109                new StringPresenter());
110        listRowAdapter.add("Media Item 1");
111        listRowAdapter.add("Media Item 2");
112        listRowAdapter.add("Media Item 3");
113        HeaderItem header = new HeaderItem(0, "Related Items", null);
114        mRowsAdapter.add(new ListRow(header, listRowAdapter));
115
116        setAdapter(mRowsAdapter);
117    }
118}
119</pre>
120
121
122<h3 id="activity">詳細アクティビティを作成する</h3>
123
124<p>
125  {@link android.support.v17.leanback.app.DetailsFragment} のようなフラグメントを表示に使用するには、これをアクティビティ内に含める必要があります。ブラウズ アクティビティとは別に、詳細ビューのアクティビティを作成すると、{@link android.content.Intent} を使用して詳細ビューを呼び出すことができます。このセクションでは、メディア アイテムの詳細ビューの実装を含んだアクティビティのビルド方法を説明します。
126</p>
127
128<p>
129  次のように {@link android.support.v17.leanback.app.DetailsFragment} の実装を参照するレイアウトをビルドして、詳細アクティビティの作成を開始します。
130</p>
131
132<pre>
133&lt;!-- file: res/layout/details.xml --&gt;
134
135&lt;fragment xmlns:android="http://schemas.android.com/apk/res/android"
136    <strong>android:name="com.example.android.mediabrowser.MediaItemDetailsFragment"</strong>
137    android:id="&#64;+id/details_fragment"
138    android:layout_width="match_parent"
139    android:layout_height="match_parent"
140/&gt;
141</pre>
142
143<p>
144  次に、前述のコード例のレイアウトを使用して、アクティビティ クラスを作成します。
145</p>
146
147<pre>
148public class DetailsActivity extends Activity
149{
150    &#64;Override
151    public void onCreate(Bundle savedInstanceState) {
152        super.onCreate(savedInstanceState);
153        <strong>setContentView(R.layout.details);</strong>
154    }
155}
156</pre>
157
158<p>
159  最後に、この新しいアクティビティをマニフェストに追加します。次のように、ユーザー インターフェースがメディア ブラウズ アクティビティと一致するように、Leanback テーマを適用します。
160</p>
161
162<pre>
163&lt;application&gt;
164  ...
165
166  &lt;activity android:name=".DetailsActivity"
167    android:exported="true"
168    <strong>android:theme="@style/Theme.Leanback"/&gt;</strong>
169
170&lt;/application&gt;
171</pre>
172
173
174<h3 id="item-listener">クリックされたアイテムのリスナを定義する</h3>
175
176<p>
177  {@link android.support.v17.leanback.app.DetailsFragment} の実装後、メインのメディア ブラウジング ビューを編集して、ユーザーがメディア アイテムをクリックしたときに詳細ビューに移動するようにします。この動作を有効にするには、 {@link android.support.v17.leanback.widget.OnItemViewClickedListener} オブジェクトを、アイテム詳細アクティビティを起動するインテントの起動元の {@link android.support.v17.leanback.app.BrowseFragment} に追加します。
178</p>
179
180<p>
181  次の例では、ユーザーがメインのメディア ブラウジング アクティビティのメディア アイテムをクリックしたときに、詳細ビューを起動するリスナの実装方法を示しています。
182</p>
183
184<pre>
185public class BrowseMediaActivity extends Activity {
186    ...
187
188    &#64;Override
189    protected void onCreate(Bundle savedInstanceState) {
190        ...
191
192        // create the media item rows
193        buildRowsAdapter();
194
195        // add a listener for selected items
196        mBrowseFragment.OnItemViewClickedListener(
197            new OnItemViewClickedListener() {
198                &#64;Override
199                public void onItemClicked(Object item, Row row) {
200                    System.out.println("Media Item clicked: " + item.toString());
201                    Intent intent = new Intent(BrowseMediaActivity.this,
202                            DetailsActivity.class);
203                    // pass the item information
204                    intent.getExtras().putLong("id", item.getId());
205                    startActivity(intent);
206                }
207            });
208    }
209}
210</pre>
211