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 @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 @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<!-- file: res/layout/details.xml --> 134 135<fragment xmlns:android="http://schemas.android.com/apk/res/android" 136 <strong>android:name="com.example.android.mediabrowser.MediaItemDetailsFragment"</strong> 137 android:id="@+id/details_fragment" 138 android:layout_width="match_parent" 139 android:layout_height="match_parent" 140/> 141</pre> 142 143<p> 144 次に、前述のコード例のレイアウトを使用して、アクティビティ クラスを作成します。 145</p> 146 147<pre> 148public class DetailsActivity extends Activity 149{ 150 @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<application> 164 ... 165 166 <activity android:name=".DetailsActivity" 167 android:exported="true" 168 <strong>android:theme="@style/Theme.Leanback"/></strong> 169 170</application> 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 @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 @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