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&lt;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  &gt;
41
42  &lt;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      /&gt;
48&lt;/LinearLayout&gt;
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    &#64;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&#64;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 &lt; 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        &#64;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