编写:awong1900 - 原文:http://developer.android.com/training/tv/discovery/in-app-search.html
当在TV上用媒体应用时,用户脑中通常有期望的内容。如果我们的应用包含一个大的内容目录,为用户找到他们想找到的内容时,用特定的标题浏览可能不是最有效的方式。一个搜索界面能帮助用户获得他们想快速浏览的内容。
Leanback support library提供一套类库去使用标准的搜索界面。在我们的应用内使用类库,可以和TV其他搜索功能,如语音搜索,获得一致性。
这节课讨论如何在我们的应用中用Leanback支持类库提供搜索界面。
当我们用BroweseFragment类做一个媒体浏览界面时,我们能使用搜索界面作为用户界面的一个标准部分。当我们设置View.OnClickListener在BrowseFragment对象时,搜索界面作为一个图标出现在布局中。接下来的示例代码展示了这个技术。
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.browse_activity); mBrowseFragment = (BrowseFragment) getFragmentManager().findFragmentById(R.id.browse_fragment); ... mBrowseFragment.setOnSearchClickedListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(BrowseActivity.this, SearchActivity.class); startActivity(intent); } }); mBrowseFragment.setAdapter(buildAdapter()); }
Note:我们能设置搜索图标的颜色用setSearchAffordanceColor(int)。
当用户选择搜索图标,系统通过定义的intent关联一个搜索activity。我们的搜索activity应该用包括SearchFragment的线性布局。这个fragment必须实现SearchFragment.SearchResultProvider界面去显示搜索结果。
接下来的示例代码展示了如何扩展SearchFragment类去提供搜索界面和结果:
public class MySearchFragment extends SearchFragment implements SearchFragment.SearchResultProvider { private static final int SEARCH_DELAY_MS = 300; private ArrayObjectAdapter mRowsAdapter; private Handler mHandler = new Handler(); private SearchRunnable mDelayedLoad; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); setSearchResultProvider(this); setOnItemClickedListener(getDefaultItemClickedListener()); mDelayedLoad = new SearchRunnable(); } @Override public ObjectAdapter getResultsAdapter() { return mRowsAdapter; } @Override public boolean onQueryTextChange(String newQuery) { mRowsAdapter.clear(); if (!TextUtils.isEmpty(newQuery)) { mDelayedLoad.setSearchQuery(newQuery); mHandler.removeCallbacks(mDelayedLoad); mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS); } return true; } @Override public boolean onQueryTextSubmit(String query) { mRowsAdapter.clear(); if (!TextUtils.isEmpty(query)) { mDelayedLoad.setSearchQuery(query); mHandler.removeCallbacks(mDelayedLoad); mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS); } return true; } }
上面的示例代码展示了在分开的线程用独立的SearchRunnable类去运行搜索请求。这个技巧是从正在阻塞的主线程保持了潜在的慢运行请求。
SearchRunnable
下一节: 创建TV游戏应用 >
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8