TV 앱 내 검색

사용자는 TV에서 미디어 앱을 사용할 때 특정 콘텐츠를 마음에 두고 있는 경우가 많습니다. 앱에 다음이 포함된 경우 대량의 콘텐츠 카탈로그를 보유하고 있지 않다면 특정 타이틀을 검색하는 것이 찾을 수 있도록 돕는 것입니다. 검색 인터페이스를 사용하면 사용자가 원하는 콘텐츠를 더 빨리 찾을 수 있습니다.

androidx.leanback 라이브러리는 표준 검색 인터페이스를 사용 설정하는 클래스 집합을 제공합니다. TV의 다른 검색 기능과 일치하며 다음과 같은 기능을 제공해야 합니다. 음성 입력을 사용할 수 있습니다.

이 가이드에서는 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())
}

자바

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

참고: <ph type="x-smartling-placeholder">setSearchAffordanceColor(int)</ph> 메서드를 사용하여 축소하도록 요청합니다.

검색어 입력 및 결과 추가

사용자가 검색 아이콘을 선택하면 시스템은 정의한 인텐트에 적용됩니다. 검색 활동의 경우 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
    }
}

자바

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 클래스와 함께 사용할 수 있습니다. 검색 결과를 표시합니다. 이 기법은 지연된 상태로 쿼리가 기본 사용자 인터페이스 스레드를 차단하지 못하도록 합니다.