使用者在電視上使用媒體應用程式時,經常需要考慮特定的內容。如果您的應用程式包含大量內容,瀏覽特定名稱可能不是最有效的方式,讓使用者能夠找到所需內容。搜尋介面可讓使用者透過比瀏覽更快的速度取得所需的內容。
Leanback androidx 程式庫提供一組類別,可讓您在應用程式中啟用標準搜尋介面,不但與電視上的其他搜尋功能一致,還提供語音輸入等功能。
本指南說明如何使用 Leanback 支援資料庫類別,在應用程式中提供搜尋介面。
新增搜尋動作
為媒體瀏覽介面使用 BrowseFragment
類別時,您可以將搜尋介面設為使用者介面的標準部分。您在 BrowseFragment
物件中設定 View.OnClickListener
時,搜尋介面是一個圖示,會顯示在版面配置中。下列程式碼範例示範了這項技巧。
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.browse_activity) browseFragment = fragmentManager.findFragmentById(R.id.browse_fragment) as BrowseFragment browseFragment.setOnSearchClickedListener { view -> val intent = Intent(this@BrowseActivity, SearchActivity::class.java) startActivity(intent) } browseFragment.setAdapter(buildAdapter()) }
Java
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.browse_activity); browseFragment = (BrowseFragment) getFragmentManager().findFragmentById(R.id.browse_fragment); ... browseFragment.setOnSearchClickedListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent intent = new Intent(BrowseActivity.this, SearchActivity.class); startActivity(intent); } }); browseFragment.setAdapter(buildAdapter()); }
注意:您可以使用 setSearchAffordanceColor(int)
方法設定搜尋圖示的顏色。
新增搜尋輸入和結果
使用者選取搜尋圖示時,系統會使用已定義的意圖叫用搜尋活動。針對搜尋活動,請使用包含 SearchFragment
的線性版面配置。這個片段也必須實作 SearchFragment.SearchResultProvider
介面,才能顯示搜尋結果。
以下程式碼範例說明如何擴充 SearchFragment
類別,以提供搜尋介面和結果:
Kotlin
class MySearchFragment : SearchFragment(), SearchFragment.SearchResultProvider { private val rowsAdapter = ArrayObjectAdapter(ListRowPresenter()) private val handler = Handler() private val delayedLoad = SearchRunnable() val resultsAdapter: ObjectAdapter get() { return rowsAdapter } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setSearchResultProvider(this) setOnItemClickedListener(getDefaultItemClickedListener()) } fun onQueryTextChange(newQuery: String): Boolean { rowsAdapter.clear() if (!TextUtils.isEmpty(newQuery)) { delayedLoad.setSearchQuery(newQuery) handler.removeCallbacks(delayedLoad) handler.postDelayed(delayedLoad, SEARCH_DELAY_MS) } return true } fun onQueryTextSubmit(query: String): Boolean { rowsAdapter.clear() if (!TextUtils.isEmpty(query)) { delayedLoad.setSearchQuery(query) handler.removeCallbacks(delayedLoad) handler.postDelayed(delayedLoad, SEARCH_DELAY_MS) } return true } companion object { private val SEARCH_DELAY_MS = 300 } }
Java
public class MySearchFragment extends SearchFragment implements SearchFragment.SearchResultProvider { private static final int SEARCH_DELAY_MS = 300; private ArrayObjectAdapter rowsAdapter; private Handler handler = new Handler(); private SearchRunnable delayedLoad; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); rowsAdapter = new ArrayObjectAdapter(new ListRowPresenter()); setSearchResultProvider(this); setOnItemClickedListener(getDefaultItemClickedListener()); delayedLoad = new SearchRunnable(); } @Override public ObjectAdapter getResultsAdapter() { return rowsAdapter; } @Override public boolean onQueryTextChange(String newQuery) { rowsAdapter.clear(); if (!TextUtils.isEmpty(newQuery)) { delayedLoad.setSearchQuery(newQuery); handler.removeCallbacks(delayedLoad); handler.postDelayed(delayedLoad, SEARCH_DELAY_MS); } return true; } @Override public boolean onQueryTextSubmit(String query) { rowsAdapter.clear(); if (!TextUtils.isEmpty(query)) { delayedLoad.setSearchQuery(query); handler.removeCallbacks(delayedLoad); handler.postDelayed(delayedLoad, SEARCH_DELAY_MS); } return true; } }
上述範例程式碼旨在與 SearchRunnable
類別搭配使用,在另一個執行緒中執行搜尋查詢。這項技術可避免執行速度較慢的查詢封鎖主要使用者介面執行緒。