TV应用内搜索
编写:awong1900 - 原文:<http://developer.android.com/training/tv/discovery/in-app-search.html>
当在TV上用媒体应用时,用户脑中通常有期望的内容。如果我们的应用包含一个大的内容目录,为用户找到他们想找到的内容时,用特定的标题浏览可能不是最有效的方式。一个搜索界面能帮助用户获得他们想快速浏览的内容。
Leanback support library提供一套类库去使用标准的搜索界面。在我们的应用内使用类库,可以和TV其他搜索功能,如语音搜索,获得一致性。
这节课讨论如何在我们的应用中用Leanback支持类库提供搜索界面。
添加搜索操作
当我们用BroweseFragment类做一个媒体浏览界面时,我们能使用搜索界面作为用户界面的一个标准部分。当我们设置View.OnClickListener在BrowseFragment对象时,搜索界面作为一个图标出现在布局中。接下来的示例代码展示了这个技术。
1. @Override
2. public void onCreate(Bundle savedInstanceState) {
3. super.onCreate(savedInstanceState);
4. setContentView(R.layout.browse_activity);
6. mBrowseFragment = (BrowseFragment)
7. getFragmentManager().findFragmentById(R.id.browse_fragment);
9. ...
11. mBrowseFragment.setOnSearchClickedListener(new View.OnClickListener() {
12. @Override
13. public void onClick(View view) {
14. Intent intent = new Intent(BrowseActivity.this, SearchActivity.class);
15. startActivity(intent);
16. }
17. });
19. mBrowseFragment.setAdapter(buildAdapter());
20. }
**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 {
4. private static final int SEARCH_DELAY_MS = 300;
5. private ArrayObjectAdapter mRowsAdapter;
6. private Handler mHandler = new Handler();
7. private SearchRunnable mDelayedLoad;
9. @Override
10. public void onCreate(Bundle savedInstanceState) {
11. super.onCreate(savedInstanceState);
13. mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
14. setSearchResultProvider(this);
15. setOnItemClickedListener(getDefaultItemClickedListener());
16. mDelayedLoad = new SearchRunnable();
17. }
19. @Override
20. public ObjectAdapter getResultsAdapter() {
21. return mRowsAdapter;
22. }
24. @Override
25. public boolean onQueryTextChange(String newQuery) {
26. mRowsAdapter.clear();
27. if (!TextUtils.isEmpty(newQuery)) {
28. mDelayedLoad.setSearchQuery(newQuery);
29. mHandler.removeCallbacks(mDelayedLoad);
30. mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
31. }
32. return true;
33. }
35. @Override
36. public boolean onQueryTextSubmit(String query) {
37. mRowsAdapter.clear();
38. if (!TextUtils.isEmpty(query)) {
39. mDelayedLoad.setSearchQuery(query);
40. mHandler.removeCallbacks(mDelayedLoad);
41. mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
42. }
43. return true;
44. }
45. }
上面的示例代码展示了在分开的线程用独立的SearchRunnable类去运行搜索请求。这个技巧是从正在阻塞的主线程保持了潜在的慢运行请求。
