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