本文介紹如何為媒體項(xiàng)目詳情創(chuàng)建 Presenter 類涌献,以及如何通過擴(kuò)展 DetailsSupportFragment
類在用戶選擇媒體項(xiàng)目時(shí)為項(xiàng)目實(shí)現(xiàn)詳情視圖。
構(gòu)建詳情 Presenter
在 Leanback 支持庫提供的媒體瀏覽框架中,您可以使用 Presenter 對(duì)象控制數(shù)據(jù)(包括媒體項(xiàng)目詳情)在屏幕上的顯示排作。該框架為此提供了 AbstractDetailsDescriptionPresenter
類攒菠,該類幾乎是對(duì)媒體項(xiàng)目詳情 Presenter 的完整實(shí)現(xiàn)。您只需實(shí)現(xiàn) onBindDescription()
方法茎活,以將視圖字段綁定到您的數(shù)據(jù)對(duì)象昙沦,如下面的代碼示例所示:
public class DetailsDescriptionPresenter
extends AbstractDetailsDescriptionPresenter {
@Override
protected void onBindDescription(ViewHolder viewHolder, Object itemData) {
MyMediaItemDetails details = (MyMediaItemDetails) itemData;
// In a production app, the itemData object contains the information
// needed to display details for the media item:
// viewHolder.getTitle().setText(details.getShortTitle());
// Here we provide static data for testing purposes:
viewHolder.getTitle().setText(itemData.toString());
viewHolder.getSubtitle().setText("2014 Drama TV-14");
viewHolder.getBody().setText("Lorem ipsum dolor sit amet, consectetur "
+ "adipisicing elit, sed do eiusmod tempor incididunt ut labore "
+ " et dolore magna aliqua. Ut enim ad minim veniam, quis "
+ "nostrud exercitation ullamco laboris nisi ut aliquip ex ea "
+ "commodo consequat.");
}
}
擴(kuò)展DetailsSupportFragment
在使用 DetailsSupportFragment
類來顯示您的媒體項(xiàng)目詳情時(shí),請(qǐng)擴(kuò)展該類以提供媒體項(xiàng)目的預(yù)覽圖片和相關(guān)操作载荔。您還可以提供其他內(nèi)容盾饮,如相關(guān)媒體項(xiàng)目的列表。
以下示例代碼演示了如何利用上一部分中顯示的 Presenter 類為正在查看的媒體項(xiàng)目添加預(yù)覽圖片和相關(guān)操作。此示例還展示了如何添加相關(guān)媒體項(xiàng)目行丘损,該行顯示在詳情列表下方普办。
public class MediaItemDetailsFragment extends DetailsSupportFragment {
private static final String TAG = "MediaItemDetailsFragment";
private ArrayObjectAdapter rowsAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate");
super.onCreate(savedInstanceState);
buildDetails();
}
private void buildDetails() {
ClassPresenterSelector selector = new ClassPresenterSelector();
// Attach your media item details presenter to the row presenter:
FullWidthDetailsOverviewRowPresenter rowPresenter =
new FullWidthDetailsOverviewRowPresenter(
new DetailsDescriptionPresenter());
selector.addClassPresenter(DetailsOverviewRow.class, rowPresenter);
selector.addClassPresenter(ListRow.class,
new ListRowPresenter());
rowsAdapter = new ArrayObjectAdapter(selector);
Resources res = getActivity().getResources();
DetailsOverviewRow detailsOverview = new DetailsOverviewRow(
"Media Item Details");
// Add images and action buttons to the details view
detailsOverview.setImageDrawable(res.getDrawable(R.drawable.jelly_beans));
detailsOverview.addAction(new Action(1, "Buy $9.99"));
detailsOverview.addAction(new Action(2, "Rent $2.99"));
rowsAdapter.add(detailsOverview);
// Add a Related items row
ArrayObjectAdapter listRowAdapter = new ArrayObjectAdapter(
new StringPresenter());
listRowAdapter.add("Media Item 1");
listRowAdapter.add("Media Item 2");
listRowAdapter.add("Media Item 3");
HeaderItem header = new HeaderItem(0, "Related Items", null);
rowsAdapter.add(new ListRow(header, listRowAdapter));
setAdapter(rowsAdapter);
}
}
創(chuàng)建詳情 Activity
諸如 DetailsSupportFragment
之類的 Fragment 必須包含在 Activity 內(nèi),才能用于顯示徘钥。您應(yīng)該為詳情視圖創(chuàng)建一個(gè) Activity衔蹲,讓其獨(dú)立于瀏覽 Activity,這樣便可以使用 Intent
來調(diào)用詳情視圖吏饿。本部分說明如何構(gòu)建一個(gè) Activity 來容納您對(duì)媒體項(xiàng)目詳情視圖的實(shí)現(xiàn)踪危。
創(chuàng)建詳情 Activity 時(shí),首先要構(gòu)建一個(gè)引用 DetailsSupportFragment
實(shí)現(xiàn)的布局:
<!-- file: res/layout/details.xml -->
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
android:name="com.example.android.mediabrowser.MediaItemDetailsFragment"
android:id="@+id/details_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
接下來猪落,創(chuàng)建一個(gè)使用上一代碼示例中所示布局的 Activity 類:
public class DetailsActivity extends FragmentActivity
{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.details);
}
}
最后贞远,將這個(gè)新 Activity 添加到清單中。請(qǐng)記得應(yīng)用 Leanback 主題背景笨忌,以確保界面與媒體瀏覽 Activity 保持一致:
<application>
...
<activity android:name=".DetailsActivity"
android:exported="true"
android:theme="@style/Theme.Leanback"/>
</application>
為點(diǎn)擊的項(xiàng)目定義監(jiān)聽器
在實(shí)現(xiàn) DetailsSupportFragment
后蓝仲,請(qǐng)將您的主媒體瀏覽視圖修改為在用戶點(diǎn)擊媒體項(xiàng)目時(shí)切換到詳情視圖。為啟用此行為官疲,請(qǐng)將一個(gè) OnItemViewClickedListener
對(duì)象添加到 BrowseSupportFragment
中袱结,以便觸發(fā)啟動(dòng)項(xiàng)目詳情 Activity 的 intent。
以下示例展示了如何實(shí)現(xiàn)一個(gè)可在用戶點(diǎn)擊主媒體瀏覽 Activity 中的某個(gè)媒體項(xiàng)目時(shí)啟動(dòng)詳情視圖的監(jiān)聽器:
public class BrowseMediaActivity extends FragmentActivity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
// create the media item rows
buildRowsAdapter();
// add a listener for selected items
browseFragment.OnItemViewClickedListener(
new OnItemViewClickedListener() {
@Override
public void onItemClicked(Object item, Row row) {
System.out.println("Media Item clicked: " + item.toString());
Intent intent = new Intent(BrowseMediaActivity.this,
DetailsActivity.class);
// pass the item information
intent.getExtras().putLong("id", item.getId());
startActivity(intent);
}
});
}
}
至此途凫,我們學(xué)習(xí)了如何實(shí)現(xiàn)AbstractDetailsDescriptionPresenter
類用于顯示媒體的詳細(xì)信息垢夹,也學(xué)習(xí)如何擴(kuò)展DetailsSupportFragment
類將DetailsOverviewRow
、FullWidthDetailsOverviewRowPresenter
维费、DetailsDescriptionPresenter
結(jié)合起來果元,實(shí)現(xiàn)最終的界面效果。