创建详情页

编写:huanglizhuo - 原文:http://developer.android.com/training/tv/playback/details.html

待认领进行编写,有意向的小伙伴,可以直接修改对应的markdown文件,进行提交!

v17 leanback support library 库提供的媒体浏览接口包含显示附加媒体信息的类,比如描述和预览,以及对项目的操作,比如购买或播放。

这节课讨论如何为媒体项目的详细信息创建 presenter 类,以及用户选择一个媒体项目时如何扩展 DetailsFragment类来实现显示媒体详细信息视图。

小贴士: 这里的实现例子用的是包含 DetailsFragment的附加activity。但也可以在同一个 activity 中用 fragment 转换将 BrowseFragment替换为 DetailsFragment.更多关于fragment的信息请参考Building a Dynamic UI with Fragments

创建详细Presenter

在leanback库提供的媒体浏览框架中,可以用presenter对象控制屏幕显示数据,包括媒体详细信息。AbstractDetailsDescriptionPresenter 类提供的框架几乎是媒体项目详细信息的完全继承。我们只需要实现onBindDescription()方法,像下面这样把数据信息和视图绑定起来。

  1. public class DetailsDescriptionPresenter
  2. extends AbstractDetailsDescriptionPresenter {
  3. @Override
  4. protected void onBindDescription(ViewHolder viewHolder, Object itemData) {
  5. MyMediaItemDetails details = (MyMediaItemDetails) itemData;
  6. // In a production app, the itemData object contains the information
  7. // needed to display details for the media item:
  8. // viewHolder.getTitle().setText(details.getShortTitle());
  9. // Here we provide static data for testing purposes:
  10. viewHolder.getTitle().setText(itemData.toString());
  11. viewHolder.getSubtitle().setText("2014 Drama TV-14");
  12. viewHolder.getBody().setText("Lorem ipsum dolor sit amet, consectetur "
  13. + "adipisicing elit, sed do eiusmod tempor incididunt ut labore "
  14. + " et dolore magna aliqua. Ut enim ad minim veniam, quis "
  15. + "nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
  16. + "commodo consequat.");
  17. }
  18. }

扩展详细fragment

当使用 DetailsFragment类显示我们的媒体项目详细信息时,扩展该类并提供像预览图片,操作等附加内容。我们也可以提供一系列的相关媒体信息。

下面的例子演示了怎样用presenter类为媒体项目添加预览图片和操作。这个例子也演示了添加相关媒体行。

  1. public class MediaItemDetailsFragment extends DetailsFragment {
  2. private static final String TAG = "MediaItemDetailsFragment";
  3. private ArrayObjectAdapter mRowsAdapter;
  4. @Override
  5. public void onCreate(Bundle savedInstanceState) {
  6. Log.i(TAG, "onCreate");
  7. super.onCreate(savedInstanceState);
  8. buildDetails();
  9. }
  10. private void buildDetails() {
  11. ClassPresenterSelector selector = new ClassPresenterSelector();
  12. // Attach your media item details presenter to the row presenter:
  13. DetailsOverviewRowPresenter rowPresenter =
  14. new DetailsOverviewRowPresenter(new DetailsDescriptionPresenter());
  15. selector.addClassPresenter(DetailsOverviewRow.class, rowPresenter);
  16. selector.addClassPresenter(ListRow.class,
  17. new ListRowPresenter());
  18. mRowsAdapter = new ArrayObjectAdapter(selector);
  19. Resources res = getActivity().getResources();
  20. DetailsOverviewRow detailsOverview = new DetailsOverviewRow(
  21. "Media Item Details");
  22. // Add images and action buttons to the details view
  23. detailsOverview.setImageDrawable(res.getDrawable(R.drawable.jelly_beans));
  24. detailsOverview.addAction(new Action(1, "Buy $9.99"));
  25. detailsOverview.addAction(new Action(2, "Rent $2.99"));
  26. mRowsAdapter.add(detailsOverview);
  27. // Add a Related items row
  28. ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(
  29. new StringPresenter());
  30. listRowAdapter.add("Media Item 1");
  31. listRowAdapter.add("Media Item 2");
  32. listRowAdapter.add("Media Item 3");
  33. HeaderItem header = new HeaderItem(0, "Related Items", null);
  34. mRowsAdapter.add(new ListRow(header, listRowAdapter));
  35. setAdapter(mRowsAdapter);
  36. }
  37. }

创建详细信息activity

DetailsFragment这样的 fragment 为了使用或显示必须包含activity。为我们的详细信息与浏览分开创建activity并通过传递Intent打开。这节演示了如何创建一个包含媒体详细信息的activity。

创建详细信息前先为 DetailsFragment创建一个布局文件:

  1. <!-- file: res/layout/details.xml -->
  2. <fragment xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:name="com.example.android.mediabrowser.MediaItemDetailsFragment"
  4. android:id="@+id/details_fragment"
  5. android:layout_width="match_parent"
  6. android:layout_height="match_parent"
  7. />

接下来用上面的布局文件创建一个activity:

  1. public class DetailsActivity extends Activity
  2. {
  3. @Override
  4. public void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.details);
  7. }
  8. }

最后在manifest文件中申明activity。记得添加Leanback主题以确保用户界面中有媒体浏览activity。

  1. <application>
  2. ...
  3. <activity android:name=".DetailsActivity"
  4. android:exported="true"
  5. android:theme="@style/Theme.Leanback"/>
  6. </application>

为点击项目添加Listener

实现 DetailsFragment后,在用户点击媒体条目时将我们的媒体浏览view切换详细信息view。为了确保动作的实现,在BrowserFragment中添加[OnItemViewClickedListener]通过Intent开启详细信息activity。

下面的例子演示了实现怎样在媒体浏览view中实现一个 listener开启详细信息view。

  1. public class BrowseMediaActivity extends Activity {
  2. ...
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. ...
  6. // create the media item rows
  7. buildRowsAdapter();
  8. // add a listener for selected items
  9. mBrowseFragment.OnItemViewClickedListener(
  10. new OnItemViewClickedListener() {
  11. @Override
  12. public void onItemClicked(Object item, Row row) {
  13. System.out.println("Media Item clicked: " + item.toString());
  14. Intent intent = new Intent(BrowseMediaActivity.this,
  15. DetailsActivity.class);
  16. // pass the item information
  17. intent.getExtras().putLong("id", item.getId());
  18. startActivity(intent);
  19. }
  20. });
  21. }
  22. }

下一节:显示正在播放卡片 >