TV应用内搜索

编写:awong1900 - 原文:http://developer.android.com/training/tv/discovery/in-app-search.html

当在TV上用媒体应用时,用户脑中通常有期望的内容。如果我们的应用包含一个大的内容目录,为用户找到他们想找到的内容时,用特定的标题浏览可能不是最有效的方式。一个搜索界面能帮助用户获得他们想快速浏览的内容。

Leanback support library提供一套类库去使用标准的搜索界面。在我们的应用内使用类库,可以和TV其他搜索功能,如语音搜索,获得一致性。

这节课讨论如何在我们的应用中用Leanback支持类库提供搜索界面。

添加搜索操作

当我们用BroweseFragment类做一个媒体浏览界面时,我们能使用搜索界面作为用户界面的一个标准部分。当我们设置View.OnClickListenerBrowseFragment对象时,搜索界面作为一个图标出现在布局中。接下来的示例代码展示了这个技术。

  1. @Override
  2. public void onCreate(Bundle savedInstanceState) {
  3. super.onCreate(savedInstanceState);
  4. setContentView(R.layout.browse_activity);
  5. mBrowseFragment = (BrowseFragment)
  6. getFragmentManager().findFragmentById(R.id.browse_fragment);
  7. ...
  8. mBrowseFragment.setOnSearchClickedListener(new View.OnClickListener() {
  9. @Override
  10. public void onClick(View view) {
  11. Intent intent = new Intent(BrowseActivity.this, SearchActivity.class);
  12. startActivity(intent);
  13. }
  14. });
  15. mBrowseFragment.setAdapter(buildAdapter());
  16. }
**Note**: You can set the color of the search icon using the setSearchAffordanceColor(int).-->

Note:我们能设置搜索图标的颜色用setSearchAffordanceColor(int))。

添加搜索输入和结果展示

当用户选择搜索图标,系统通过定义的intent关联一个搜索activity。我们的搜索activity应该用包括SearchFragment的线性布局。这个fragment必须实现SearchFragment.SearchResultProvider界面去显示搜索结果。

接下来的示例代码展示了如何扩展SearchFragment类去提供搜索界面和结果:

  1. public class MySearchFragment extends SearchFragment
  2. implements SearchFragment.SearchResultProvider {
  3. private static final int SEARCH_DELAY_MS = 300;
  4. private ArrayObjectAdapter mRowsAdapter;
  5. private Handler mHandler = new Handler();
  6. private SearchRunnable mDelayedLoad;
  7. @Override
  8. public void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
  11. setSearchResultProvider(this);
  12. setOnItemClickedListener(getDefaultItemClickedListener());
  13. mDelayedLoad = new SearchRunnable();
  14. }
  15. @Override
  16. public ObjectAdapter getResultsAdapter() {
  17. return mRowsAdapter;
  18. }
  19. @Override
  20. public boolean onQueryTextChange(String newQuery) {
  21. mRowsAdapter.clear();
  22. if (!TextUtils.isEmpty(newQuery)) {
  23. mDelayedLoad.setSearchQuery(newQuery);
  24. mHandler.removeCallbacks(mDelayedLoad);
  25. mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
  26. }
  27. return true;
  28. }
  29. @Override
  30. public boolean onQueryTextSubmit(String query) {
  31. mRowsAdapter.clear();
  32. if (!TextUtils.isEmpty(query)) {
  33. mDelayedLoad.setSearchQuery(query);
  34. mHandler.removeCallbacks(mDelayedLoad);
  35. mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
  36. }
  37. return true;
  38. }
  39. }

上面的示例代码展示了在分开的线程用独立的SearchRunnable类去运行搜索请求。这个技巧是从正在阻塞的主线程保持了潜在的慢运行请求。


下一节: 创建TV游戏应用 >