Użytkownicy aplikacji do multimediów na telewizorze często mają na myśli konkretne treści. Jeśli aplikacja zawiera ogromny katalog treści, przeglądanie konkretnego tytułu może nie być najskuteczniejszym sposobem użytkownikom w celu znalezienia tego, czego szukają. Interfejs wyszukiwania może ułatwić użytkownikom którzy chcą przeglądać treści szybciej niż przeglądanie.
Biblioteka androidx.leanback udostępnia zestaw klas do korzystania ze standardowego interfejsu wyszukiwania jest zgodna z innymi funkcjami wyszukiwania na telewizorze i zapewnia takie funkcje jak głosowe wprowadzanie tekstu.
Ten przewodnik zawiera informacje o tym, jak udostępnić w aplikacji interfejs wyszukiwania za pomocą funkcji Leanback. klas bibliotecznych.
Dodaj działanie wyszukiwania
Gdy dla pliku multimedialnego używasz klasy BrowseFragment
interfejsu przeglądania, możesz włączyć interfejs wyszukiwania jako standardowy element
za pomocą prostego interfejsu online. Interfejs wyszukiwania to ikona, która pojawia się w układzie po ustawieniu opcji View.OnClickListener
na: BrowseFragment
obiektu. Poniższy przykładowy kod ilustruje tę metodę.
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()); }
Uwaga: możesz ustawić kolor ikony wyszukiwania za pomocą
setSearchAffordanceColor(int)
.
Dodaj dane wejściowe i wyniki wyszukiwania
Gdy użytkownik wybierze ikonę wyszukiwania, system wywołuje aktywność związaną z wyszukiwaniem przy użyciu polecenia
zdefiniowaną intencję. W aktywności związanej z wyszukiwaniem użyj układu liniowego zawierającego element
SearchFragment
Ten fragment musi też implementować komponent SearchFragment.SearchResultProvider
w celu wyświetlenia wyników wyszukiwania.
Poniższy przykładowy kod pokazuje, jak rozszerzyć klasę SearchFragment
aby udostępnić interfejs wyszukiwania i wyniki:
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; } }
Poprzedni przykładowy kod jest przeznaczony do użycia z klasą SearchRunnable
które powoduje uruchomienie zapytania w osobnym wątku. Ta technika może działać wolniej
przed blokowaniem głównego wątku interfejsu użytkownika.