leanback android,Android TV Leanback (五)(使用leanback创建UI)

leanback android,Android TV Leanback (五)(使用leanback创建UI)创建浏览布局 leanback 库的 BrowseFragme 允许您创建一个主要布局 以最少的代码浏览媒体项的类别和行 代码示例如下 android id id main frame android layout width match parent android layout height match parent gt android name com example andro

创建浏览布局

leanback库的BrowseFragment允许您创建一个主要布局,以最少的代码浏览媒体项的类别和行。

代码示例如下:

android:id=”@+id/main_frame”

android:layout_width=”match_parent”

android:layout_height=”match_parent”>

android:name=”com.example.android.tvleanback.ui.MainFragment”

android:id=”@+id/main_browse_fragment”

android:layout_width=”match_parent”

android:layout_height=”match_parent” />

在activity中设置布局:

public class MainActivity extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

}

BrowseFragment 用视频数据和UI元素填充视图,并设置布局参数,如图标、标题以及是否启用了类别标题。

setUIElements 用于设置UI元素

setHeadersState 设置类别标题状态

应用程序的子类实现BrowseFragment 的方法,为UI元素设置事件监听,准备背景管理器等,代码示例如下:

public class MainFragment extends BrowseFragment implements

LoaderManager.LoaderCallbacks>> {

@Override

public void onActivityCreated(Bundle savedInstanceState) {

super.onActivityCreated(savedInstanceState);

loadVideoData();

prepareBackgroundManager();

setupUIElements();

setupEventListeners();

}

private void prepareBackgroundManager() {

mBackgroundManager = BackgroundManager.getInstance(getActivity());

mBackgroundManager.attach(getActivity().getWindow());

mDefaultBackground = getResources()

.getDrawable(R.drawable.default_background);

mMetrics = new DisplayMetrics();

getActivity().getWindowManager().getDefaultDisplay().getMetrics(mMetrics);

}

private void setupUIElements() {

setBadgeDrawable(getActivity().getResources()

.getDrawable(R.drawable.videos_by_google_banner));

// Badge, when set, takes precedent over title

setTitle(getString(R.string.browse_title));

setHeadersState(HEADERS_ENABLED);

setHeadersTransitionOnBackEnabled(true);

// set headers background color

setBrandColor(getResources().getColor(R.color.fastlane_background));

// set search icon color

setSearchAffordanceColor(getResources().getColor(R.color.search_opaque));

}

private void loadVideoData() {

VideoProvider.setContext(getActivity());

mVideosUrl = getActivity().getResources().getString(R.string.catalog_url);

getLoaderManager().initLoader(0, null, this);

}

private void setupEventListeners() {

setOnSearchClickedListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

Intent intent = new Intent(getActivity(), SearchActivity.class);

startActivity(intent);

}

});

setOnItemViewClickedListener(new ItemViewClickedListener());

setOnItemViewSelectedListener(new ItemViewSelectedListener());

}

设置UI元素

034be3270a00

browse.png

setBadgeDrawable() 将指定的图片放置到browse fragment的右上角,如图UI_Element.png。当调用setTitle()时,字符串将替换图片。

setTitle() 设置标题并显示在fragment的右上角,除非调用了setBadgeDrawable()。

setHeadersState()和setHeadersTransitionOnBackEnabled() 隐藏或不使用分类标题。

setBrandColor() 设置分类标题区块的背景颜色。

setSearchAffordanceColor() 设置搜索图标的背景颜色。

自定义分类标题的视图

你可以自定义包括更多视图的复杂布局。

自定义布局如下:

android:orientation=”horizontal”

android:layout_width=”match_parent”

android:layout_height=”match_parent”>

android:id=”@+id/header_icon”

android:layout_width=”32dp”

android:layout_height=”32dp” />

android:id=”@+id/header_label”

android:layout_marginTop=”6dp”

android:layout_width=”wrap_content”

android:layout_height=”wrap_content” />

使用Presenter实现抽象方法:create,bind,unbind ,如下:

public class IconHeaderItemPresenter extends Presenter {

@Override

public ViewHolder onCreateViewHolder(ViewGroup viewGroup) {

LayoutInflater inflater = (LayoutInflater) viewGroup.getContext()

.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View view = inflater.inflate(R.layout.icon_header_item, null);

return new ViewHolder(view);

}

@Override

public void onBindViewHolder(ViewHolder viewHolder, Object o) {

HeaderItem headerItem = ((ListRow) o).getHeaderItem();

View rootView = viewHolder.view;

ImageView iconView = (ImageView) rootView.findViewById(R.id.header_icon);

Drawable icon = rootView.getResources().getDrawable(R.drawable.ic_action_video, null);

iconView.setImageDrawable(icon);

TextView label = (TextView) rootView.findViewById(R.id.header_label);

label.setText(headerItem.getName());

}

@Override

public void onUnbindViewHolder(ViewHolder viewHolder) {

// no op

}

}

这个例子展示了如何定义一个多视图的复杂的presenter。然而,有种更简单的方式结合TextView和图片,通过使用TextView.drawableLeft属性。这种方式就不需要Imageview。

在fragment中显示,如下:

setHeaderPresenterSelector(new PresenterSelector() {

@Override

public Presenter getPresenter(Object o) {

return new IconHeaderItemPresenter();

}

});

设置标题区块的显示状态

使用BrowseFragment.setHeadersState()设置标题区块的状态。

HEADERS_ENABLED 当Fragment被创建时,默认可用并显示;

HEADERS_HIDDEN 当Fragment被创建时,默认隐藏;

HEADERS_DISABLED 当Fragment被创建时,默认不可用并绝不显示。

显示媒体列表

BrowseFragment允许你使用Adapter和Presenter定义并显示可浏览的媒体内容类别和项目。Adapter可以连接到包含媒体目录信息的本地或在线数据源。Adapter使用Presenter创建视图并绑定数据以显示到屏幕上。

实现presenter,如下:

public class StringPresenter extends Presenter {

private static final String TAG = “StringPresenter”;

public ViewHolder onCreateViewHolder(ViewGroup parent) {

TextView textView = new TextView(parent.getContext());

textView.setFocusable(true);

textView.setFocusableInTouchMode(true);

textView.setBackground(

parent.getContext().getResources().getDrawable(R.drawable.text_bg));

return new ViewHolder(textView);

}

public void onBindViewHolder(ViewHolder viewHolder, Object item) {

((TextView) viewHolder.view).setText(item.toString());

}

public void onUnbindViewHolder(ViewHolder viewHolder) {

// no op

}

}

构造Adapter使用Presenter来显示类别和项目:

private ArrayObjectAdapter mRowsAdapter;

private static final int NUM_ROWS = 4;

@Override

protected void onCreate(Bundle savedInstanceState) {

buildRowsAdapter();

}

private void buildRowsAdapter() {

mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());

for (int i = 0; i < NUM_ROWS; ++i) {

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(i, “Category ” + i);

mRowsAdapter.add(new ListRow(header, listRowAdapter));

}

mBrowseFragment.setAdapter(mRowsAdapter);

}

更新背景

使用 BackgroundManager改变activity的背景,如下:

protected void updateBackground(Drawable drawable) {

BackgroundManager.getInstance(this).setDrawable(drawable);

}

根据用户的当前选择自动更新背景:

protected void clearBackground() {

BackgroundManager.getInstance(this).setDrawable(mDefaultBackground);

}

protected OnItemViewSelectedListener getDefaultItemViewSelectedListener() {

return new OnItemViewSelectedListener() {

@Override

public void onItemSelected(Object item, Row row) {

if (item instanceof Movie ) {

Drawable background = ((Movie)item).getBackdropDrawable();

updateBackground(background);

} else {

clearBackground();

}

}

};

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207244.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午2:15
下一篇 2026年3月19日 下午2:15


相关推荐

  • Win10自动修复无法开机【完美解决】

    Win10自动修复无法开机【完美解决】Windows10 操作系统于 2015 年 7 月 29 日正式发布 此后 win10 也就成了新上市的笔记本电脑或者台式机电脑的预装操作系统 win10 系统给我们带了全新的体验 当然也带来了一定的烦恼 就拿 win10 自动修复这个功能来说 玩过 win10 的朋友 多数人都遇到过 win10 一开机就自动修复 而且开机自动修复失败 然后电脑开机卡在自动修复 只能重启 再自动修复 再重启 始终无法开机 我的一个朋

    2026年3月17日
    1
  • 在线教程丨 GLM-Image 基于自回归+扩散解码器混合架构,精准理解指令写对文字

    在线教程丨 GLM-Image 基于自回归+扩散解码器混合架构,精准理解指令写对文字

    2026年3月12日
    3
  • PyCharm使用教程 — 9、PyCharm中的搜索技巧(文件/函数/内容)「建议收藏」

    PyCharm使用教程 — 9、PyCharm中的搜索技巧(文件/函数/内容)「建议收藏」PyCharm搜索(文件、函数、内容)Pycharm对搜索有很强大的支持,非常方便我们在项目中搜索某个关键词,或者函数等等1、文件内检索在文件内Ctrl+F,如下图所示2、文件内替换快捷键Ctrl+R,将搜索到的内容替换成目标内容。说明:保留原有大小写,比如原来的首字母是大写,替换之后仍旧保留首字母大写。如下所示3、项目中查找1、Ctrl+Shift+F该快捷键容易冲突,比如本地如果安装了搜狗输入法,可以先将对应的快捷键关闭再使用。或者通过菜单栏进入,如下图

    2022年8月28日
    4
  • android okio使用方法,Android 开源框架 Okio 原理剖析「建议收藏」

    android okio使用方法,Android 开源框架 Okio 原理剖析「建议收藏」Retrofit,OkHttp,Okio是Square团队开源的安卓平台网络层三板斧,它们逐层分工,非常优雅地解决我们对网络请求甚至更广泛的I/O操作的需求。其中最底层的Okio堪称小而美,功能也更基础,应用更广泛。这次我们就对它进行一个详细的分析。本文的分析基于Okio截至2016.8.4的最新源码,非常建议大家下载Okio源码之后,跟着本文,过一遍源码。1,概览和分析…

    2022年5月30日
    36
  • c语言实现图书管理系统创新_c语言图书管理系统源代码

    c语言实现图书管理系统创新_c语言图书管理系统源代码/* 课程设计项目名称:图书查询系统 作者:施瑞文 时间:2018.3.4*/#include&lt;stdio.h&gt;#include&lt;string.h&gt;#include&lt;windows.h&gt;#include&lt;conio.h&gt;#include&lt;stdlib.h&gt;#defineNsizeof(structBOOK)…

    2022年10月11日
    5
  • Swift 值类型和引用类型

    Swift中的类型分为两类:一,值类型(valuetypes),每个值类型的实例都拥有各自唯一的数据,通常它们是结构体,枚举或元组;二,引用类型(referencetypes),引用类型的实例共享

    2021年12月26日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号