1page.title=カタログ ブラウザを作成する 2page.tags=tv, browsefragment, presenter, backgroundmanager 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="#layout">メディア ブラウズ レイアウトを作成する</a></li> 13 <li><a href="#lists">メディア リストを表示する</a></li> 14 <li><a href="#background">背景をアップデートする</a></li> 15 </ol> 16 17</div> 18</div> 19 20<p> 21 TV で使用するメディア アプリでは、ユーザーがコンテンツ内容をブラウズして選び、再生を開始できるようにする必要があります。このタイプのアプリのコンテンツ ブラウジングに関するユーザー エクスペリエンスは、シンプルで直感的、そして目を楽しませる魅力的なものである必要があります。 22</p> 23 24<p> 25 このレッスンでは、<a href="{@docRoot}tools/support-library/features.html#v17-leanback">v17 leanback サポート ライブラリ</a> が提供するクラスを使用して、アプリのメディア カタログから音楽やビデオを閲覧するためのユーザー インターフェースを実装する方法を説明します。 26</p> 27 28 29<h2 id="layout">メディア ブラウズ レイアウトを作成する</h2> 30 31<p> 32 leanback サポート ライブラリの {@link android.support.v17.leanback.app.BrowseFragment} クラスを使用すると、最小限のコードでブラウジング カテゴリのプライマリ レイアウトとメディア アイテムの行を作成できます。次の例では、{@link android.support.v17.leanback.app.BrowseFragment} を含むレイアウトの作成方法を示します。 33</p> 34 35<pre> 36<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 37 android:layout_width="match_parent" 38 android:layout_height="match_parent" 39 android:orientation="vertical" 40 > 41 42 <fragment 43 <strong>android:name="android.support.v17.leanback.app.BrowseFragment"</strong> 44 android:id="@+id/browse_fragment" 45 android:layout_width="match_parent" 46 android:layout_height="match_parent" 47 /> 48</LinearLayout> 49</pre> 50 51<p> 52 アクティビティ内でこのレイアウトを使用して作業するには、レイアウトから{@link android.support.v17.leanback.app.BrowseFragment} エレメントを取得します。このクラスのメソッドを使用して、アイコン、タイトル、カテゴリ ヘッダーが有効になっているかどうかなどの表示パラメータを設定します。次のコード サンプルでは、レイアウト内で {@link android.support.v17.leanback.app.BrowseFragment} のレイアウト パラメータの設定方法を示します。 53</p> 54 55<pre> 56public class BrowseMediaActivity extends Activity { 57 58 public static final String TAG ="BrowseActivity"; 59 60 protected BrowseFragment mBrowseFragment; 61 62 @Override 63 protected void onCreate(Bundle savedInstanceState) { 64 super.onCreate(savedInstanceState); 65 setContentView(R.layout.browse_fragment); 66 67 final FragmentManager fragmentManager = getFragmentManager(); 68 <strong>mBrowseFragment = (BrowseFragment) fragmentManager.findFragmentById( 69 R.id.browse_fragment);</strong> 70 71 // Set display parameters for the BrowseFragment 72 mBrowseFragment.setHeadersState(BrowseFragment.HEADERS_ENABLED); 73 mBrowseFragment.setTitle(getString(R.string.app_name)); 74 mBrowseFragment.setBadgeDrawable(getResources().getDrawable( 75 R.drawable.ic_launcher)); 76 mBrowseFragment.setBrowseParams(params); 77 78 } 79} 80</pre> 81 82 83<h2 id="lists">メディア リストを表示する</h2> 84 85<p> 86 {@link android.support.v17.leanback.app.BrowseFragment} ではアダプタとプレゼンターを使用して、ブラウズ可能なメディア コンテンツのカテゴリや、メディア カタログのメディア アイテムを定義したり、表示したりできます。アダプタを使用すると、メディア カタログ情報が含まれているローカルやオンラインのデータ ソースに接続できます。プレゼンターは、メディア アイテムに関するデータを保持し、スクリーンにアイテムを表示する際のレイアウト情報を提供します。 87</p> 88 89<p> 90 次のコード例では、文字列データを表示する際の{@link android.support.v17.leanback.widget.Presenter} の実装について示します。 91</p> 92 93<pre> 94public class StringPresenter extends Presenter { 95 private static final String TAG = "StringPresenter"; 96 97 public ViewHolder onCreateViewHolder(ViewGroup parent) { 98 TextView textView = new TextView(parent.getContext()); 99 textView.setFocusable(true); 100 textView.setFocusableInTouchMode(true); 101 textView.setBackground( 102 parent.getContext().getResources().getDrawable(R.drawable.text_bg)); 103 return new ViewHolder(textView); 104 } 105 106 public void onBindViewHolder(ViewHolder viewHolder, Object item) { 107 ((TextView) viewHolder.view).setText(item.toString()); 108 } 109 110 public void onUnbindViewHolder(ViewHolder viewHolder) { 111 // no op 112 } 113} 114</pre> 115 116<p> 117 メディア アイテムのプレゼンター クラスを構築したら、アダプタをビルドしたり、{@link android.support.v17.leanback.app.BrowseFragment} にアタッチしたりして、ユーザーのブラウジング用にスクリーン上にそれらのアイテムを表示させることができます。次のコード例では、1 つ前のコード例に示したように、{@code StringPresenter} クラスを使用して、カテゴリ内にカテゴリとアイテムを表示するためのアダプタの構築方法を示します。 118</p> 119 120<pre> 121private ArrayObjectAdapter mRowsAdapter; 122private static final int NUM_ROWS = 4; 123 124@Override 125protected void onCreate(Bundle savedInstanceState) { 126 ... 127 128 buildRowsAdapter(); 129} 130 131private void buildRowsAdapter() { 132 mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); 133 134 for (int i = 0; i < NUM_ROWS; ++i) { 135 ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter( 136 new StringPresenter()); 137 listRowAdapter.add("Media Item 1"); 138 listRowAdapter.add("Media Item 2"); 139 listRowAdapter.add("Media Item 3"); 140 HeaderItem header = new HeaderItem(i, "Category " + i, null); 141 mRowsAdapter.add(new ListRow(header, listRowAdapter)); 142 } 143 144 mBrowseFragment.setAdapter(mRowsAdapter); 145} 146</pre> 147 148<p> 149 この例では、アダプタの静的実装を示します。一般的なメディア ブラウジング アプリは、オンライン データベースやウェブ サービスのデータを使用します。ウェブから取得したデータを使用したブラウジング アプリの例については、<a href="http://github.com/googlesamples/androidtv-leanback">Android TV</a> のサンプル アプリを参照してください。 150</p> 151 152<h2 id="background">背景をアップデートする</h2> 153 154<p> 155 TV で使用されるメディア ブラウジング アプリを目立たせるために、ユーザーがコンテンツをブラウジングしている間の背景イメージをアップデートできます。これにより、アプリの使用がユーザーにとって、より動きのある楽しいものになります。 156</p> 157 158<p> 159 Leanback サポート ライブラリは、TV アプリのアクティビティの背景を変更するための {@link android.support.v17.leanback.app.BackgroundManager} クラスを提供しています。次の例では、TV アプリのアクティビティ内の背景をアップデートする簡単なメソッドの作成方法を示します。 160</p> 161 162<pre> 163protected void updateBackground(Drawable drawable) { 164 BackgroundManager.getInstance(this).setDrawable(drawable); 165} 166</pre> 167 168<p> 169 ほとんどの既存のメディア ブラウズ アプリでは、ユーザーがメディア リストをスクロールするのに合わせて自動的に背景がアップデートされます。これを行うには選択リスナを設定して、ユーザーの現在の選択に基づいて自動的に背景をアップデートできるようにします。次の例では、{@link android.support.v17.leanback.widget.OnItemViewSelectedListener} クラスをセットアップして、選択イベントの判別後に背景をアップデートする方法を示します。 170</p> 171 172<pre> 173protected void clearBackground() { 174 BackgroundManager.getInstance(this).setDrawable(mDefaultBackground); 175} 176 177protected OnItemViewSelectedListener getDefaultItemViewSelectedListener() { 178 return new OnItemViewSelectedListener() { 179 @Override 180 public void onItemSelected(Object item, Row row) { 181 if (item instanceof Movie ) { 182 URI uri = ((Movie)item).getBackdropURI(); 183 updateBackground(uri); 184 } else { 185 clearBackground(); 186 } 187 } 188 }; 189} 190</pre> 191 192<p class="note"> 193 <strong>注意:</strong>上記の実装例はわかりやすく示すため、実際よりも単純化されています。実際にアプリでこの機能を作成する際は、パフォーマンス向上のために、別のスレッドで背景のアップデート アクションを実行するようにしてください。また、ユーザーがアイテムをスクロールする動作に合わせて背景をアップデートする場合には、ユーザーが 1 つのアイテムに落ち着くまで、背景イメージのアップデートを遅らせる時間を追加することも検討してください。これにより、背景イメージのアップデートが過剰にならないようにします。 194</p> 195