Android TV開發(fā)之構(gòu)建詳情視圖

本文介紹如何為媒體項(xiàng)目詳情創(chuàng)建 Presenter 類,以及如何通過擴(kuò)展 DetailsSupportFragment 類在用戶選擇媒體項(xiàng)目時為項(xiàng)目實(shí)現(xiàn)詳情視圖。

構(gòu)建詳情 Presenter

在 Leanback 支持庫提供的媒體瀏覽框架中,您可以使用 Presenter 對象控制數(shù)據(jù)(包括媒體項(xiàng)目詳情)在屏幕上的顯示。該框架為此提供了 AbstractDetailsDescriptionPresenter 類,該類幾乎是對媒體項(xiàng)目詳情 Presenter 的完整實(shí)現(xiàn)。您只需實(shí)現(xiàn) onBindDescription() 方法,以將視圖字段綁定到您的數(shù)據(jù)對象,如下面的代碼示例所示:

    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)目詳情時,請擴(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)建一個 Activity,讓其獨(dú)立于瀏覽 Activity,這樣便可以使用 Intent 來調(diào)用詳情視圖。本部分說明如何構(gòu)建一個 Activity 來容納您對媒體項(xiàng)目詳情視圖的實(shí)現(xiàn)。

創(chuàng)建詳情 Activity 時,首先要構(gòu)建一個引用 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)建一個使用上一代碼示例中所示布局的 Activity 類:

    public class DetailsActivity extends FragmentActivity
    {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.details);
        }
    }

最后,將這個新 Activity 添加到清單中。請記得應(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 后,請將您的主媒體瀏覽視圖修改為在用戶點(diǎn)擊媒體項(xiàng)目時切換到詳情視圖。為啟用此行為,請將一個 OnItemViewClickedListener 對象添加到 BrowseSupportFragment 中,以便觸發(fā)啟動項(xiàng)目詳情 Activity 的 intent。

以下示例展示了如何實(shí)現(xiàn)一個可在用戶點(diǎn)擊主媒體瀏覽 Activity 中的某個媒體項(xià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、FullWidthDetailsOverviewRowPresenterDetailsDescriptionPresenter結(jié)合起來,實(shí)現(xiàn)最終的界面效果。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容