Android Studio V3.12環(huán)境下TV開發(fā)教程
(轉(zhuǎn)自Android官網(wǎng)https://developer.android.com/training/tv/start)
文章源自:光谷佳武 https://blog.csdn.net/jiawuhan/article/details/80620174
v17 leanback支持庫提供的媒體瀏覽界面類包括用于顯示有關(guān)媒體項目的附加信息(如描述或評論)以及對該項目采取措施(如購買或播放其內(nèi)容)的類。
本課討論如何為媒體項目詳細(xì)信息創(chuàng)建演示者類,以及如何在用戶選擇媒體項目時擴(kuò)展DetailsFragment類以實(shí)現(xiàn)媒體項目的詳細(xì)信息視圖。
注意:此處顯示的實(shí)現(xiàn)示例使用額外的活動來包含DetailsFragment。但是,可以避免通過使用片段事務(wù)將當(dāng)前的BrowseFragment替換為同一活動內(nèi)的BrowseFragment來創(chuàng)建第二個活動。有關(guān)使用片段事務(wù)的更多信息,請參閱使用片段訓(xùn)練構(gòu)建動態(tài)UI。
在leanback庫提供的媒體瀏覽框架中,您使用演示者對象來控制屏幕上的數(shù)據(jù)顯示,包括媒體項目詳細(xì)信息。該框架為此提供了AbstractDetailsDescriptionPresenter類,這是演示者對媒體項目詳細(xì)信息的幾乎完整的實(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.");? ? }}
使用DetailsFragment類顯示媒體項目詳細(xì)信息時,請擴(kuò)展該類以提供其他內(nèi)容,例如預(yù)覽圖像和媒體項目的操作。您還可以提供其他內(nèi)容,例如相關(guān)媒體項目的列表。
以下示例代碼演示了如何使用前一節(jié)中顯示的演示者類來為正在查看的媒體項目添加預(yù)覽圖像和操作。此示例還顯示了相關(guān)媒體項行的添加,該行顯示在詳細(xì)信息列表下方。
public class MediaItemDetailsFragment extends DetailsFragment {? ? private static final String TAG = "MediaItemDetailsFragment";? ? private ArrayObjectAdapter mRowsAdapter;? ? @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());? ? ? ? mRowsAdapter = 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"));? ? ? ? mRowsAdapter.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);? ? ? ? mRowsAdapter.add(new ListRow(header, listRowAdapter));? ? ? ? setAdapter(mRowsAdapter);? ? }}
片段(如DetailsFragment必須包含在一個活動中才能用于顯示。為您的詳細(xì)信息視圖創(chuàng)建一個活動,與瀏覽活動分開,使您可以使用Intent調(diào)用您的詳細(xì)信息視圖。本節(jié)介紹如何構(gòu)建一個活動來包含您的媒體項目的詳細(xì)視圖實(shí)現(xiàn)。
通過構(gòu)建引用您的DetailsFragment實(shí)現(xiàn)的布局來開始創(chuàng)建細(xì)節(jié)活動:
android:name="com.example.android.mediabrowser.MediaItemDetailsFragment"? ? android:id="@+id/details_fragment"? ? android:layout_width="match_parent"? ? android:layout_height="match_parent"/>
接下來,創(chuàng)建一個使用前面代碼示例中顯示的布局的活動類:
public class DetailsActivity extends Activity{? ? @Override? ? public void onCreate(Bundle savedInstanceState) {? ? ? ? super.onCreate(savedInstanceState);? ? ? ? setContentView(R.layout.details);? ? }}
最后,將這個新的活動添加到清單。請記住應(yīng)用Leanback主題以確保用戶界面與媒體瀏覽活動一致:
? ...
? android:theme="@style/Theme.Leanback"/>
在實(shí)現(xiàn)了DetailsFragment,修改主媒體瀏覽視圖以在用戶單擊媒體項目時移至您的詳細(xì)信息視圖。為了啟用此行為,請將一個OnItemViewClickedListener對象添加到OnItemViewClickedListener,該對象觸發(fā)了啟動項目詳細(xì)信息活動的意圖。
以下示例顯示了如何在用戶單擊主媒體瀏覽活動中的媒體項時實(shí)現(xiàn)偵聽器以啟動詳細(xì)信息視圖:
public class BrowseMediaActivity extends Activity {? ? ...? ? @Override? ? protected void onCreate(Bundle savedInstanceState) {? ? ? ? ...? ? ? ? // create the media item rows? ? ? ? buildRowsAdapter();? ? ? ? // add a listener for selected items? ? ? ? mBrowseFragment.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);? ? ? ? ? ? ? ? }? ? ? ? ? ? });? ? }}