TV uygulamalarında arama

TV'de bir medya uygulaması kullanırken kullanıcıların aklında genellikle belirli bir içerik vardır. Uygulamanız büyük bir içerik kataloğuna sahip olmak; belirli bir içeriğe göz atmak, aradıklarını bulmasını kolaylaştırır. Arama arayüzü, kullanıcılarınızın daha hızlı olmasını istiyorlar.

androidx.leanback kitaplığı, standart bir arama arayüzünü etkinleştirmek için bir dizi sınıf sağlar TV'deki diğer arama işlevleriyle tutarlı olan ve ses girişi'ne dokunun.

Bu kılavuzda, Leanback desteğini kullanarak uygulamanızda nasıl arama arayüzü sağlayacağınız açıklanmaktadır. inceleyebilirsiniz.

Arama işlemi ekleyin

Bir medya için BrowseFragment sınıfını kullandığınızda bir arama arayüzünü kullanıcılarınızın standart bir parçası olarak etkinleştirebilirsiniz. kullanır. Arama arayüzü, BrowseFragment üzerinde View.OnClickListener öğesini ayarladığınızda düzende görünen bir simgedir nesnesini tanımlayın. Aşağıdaki örnek kod bu tekniği göstermektedir.

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());
}

Not: Arama simgesinin rengini setSearchAffordanceColor(int) yöntemidir.

Arama girişi ve sonuç ekleyin

Bir kullanıcı arama simgesini seçtiğinde, sistem tanımlanmış amaçtır. Arama etkinliğiniz için bir SearchFragment Bu parça, SearchFragment.SearchResultProvider öğesini de uygulamalıdır arayüzünü kullanın.

Aşağıdaki kod örneğinde, SearchFragment sınıfının nasıl genişletileceği gösterilmektedir bir arama arayüzü ve sonuçlar sağlar:

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;
    }
}

Önceki örnek kodun bir SearchRunnable sınıfıyla kullanılması amaçlanmıştır 'i kullanın. Bu teknik, çalışma sırasında sorgularının ana kullanıcı arayüzü ileti dizisini engellemesini önler.