Android 在TV應(yīng)用內(nèi)搜索

2018-08-02 18:01 更新

編寫:awong1900 - 原文:http://developer.android.com/training/tv/discovery/in-app-search.html

當(dāng)在TV上用媒體應(yīng)用時,用戶腦中通常有期望的內(nèi)容。如果我們的應(yīng)用包含一個大的內(nèi)容目錄,為用戶找到他們想找到的內(nèi)容時,用特定的標(biāo)題瀏覽可能不是最有效的方式。一個搜索界面能幫助用戶獲得他們想快速瀏覽的內(nèi)容。

Leanback support library提供一套類庫去使用標(biāo)準(zhǔn)的搜索界面。在我們的應(yīng)用內(nèi)使用類庫,可以和TV其他搜索功能,如語音搜索,獲得一致性。

這節(jié)課討論如何在我們的應(yīng)用中用Leanback支持類庫提供搜索界面。

添加搜索操作

當(dāng)我們用BroweseFragment類做一個媒體瀏覽界面時,我們能使用搜索界面作為用戶界面的一個標(biāo)準(zhǔn)部分。當(dāng)我們設(shè)置View.OnClickListenerBrowseFragment對象時,搜索界面作為一個圖標(biāo)出現(xiàn)在布局中。接下來的示例代碼展示了這個技術(shù)。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.browse_activity);

    mBrowseFragment = (BrowseFragment)
            getFragmentManager().findFragmentById(R.id.browse_fragment);

    ...

    mBrowseFragment.setOnSearchClickedListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(BrowseActivity.this, SearchActivity.class);
            startActivity(intent);
        }
    });

    mBrowseFragment.setAdapter(buildAdapter());
}
**Note**: You can set the color of the search icon using the setSearchAffordanceColor(int).-->

Note:我們能設(shè)置搜索圖標(biāo)的顏色用setSearchAffordanceColor(int))。

添加搜索輸入和結(jié)果展示

當(dāng)用戶選擇搜索圖標(biāo),系統(tǒng)通過定義的intent關(guān)聯(lián)一個搜索activity。我們的搜索activity應(yīng)該用包括SearchFragment的線性布局。這個fragment必須實現(xiàn)SearchFragment.SearchResultProvider界面去顯示搜索結(jié)果。

接下來的示例代碼展示了如何擴展SearchFragment類去提供搜索界面和結(jié)果:

public class MySearchFragment extends SearchFragment
        implements SearchFragment.SearchResultProvider {

    private static final int SEARCH_DELAY_MS = 300;
    private ArrayObjectAdapter mRowsAdapter;
    private Handler mHandler = new Handler();
    private SearchRunnable mDelayedLoad;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mRowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());
        setSearchResultProvider(this);
        setOnItemClickedListener(getDefaultItemClickedListener());
        mDelayedLoad = new SearchRunnable();
    }

    @Override
    public ObjectAdapter getResultsAdapter() {
        return mRowsAdapter;
    }

    @Override
    public boolean onQueryTextChange(String newQuery) {
        mRowsAdapter.clear();
        if (!TextUtils.isEmpty(newQuery)) {
            mDelayedLoad.setSearchQuery(newQuery);
            mHandler.removeCallbacks(mDelayedLoad);
            mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
        }
        return true;
    }

    @Override
    public boolean onQueryTextSubmit(String query) {
        mRowsAdapter.clear();
        if (!TextUtils.isEmpty(query)) {
            mDelayedLoad.setSearchQuery(query);
            mHandler.removeCallbacks(mDelayedLoad);
            mHandler.postDelayed(mDelayedLoad, SEARCH_DELAY_MS);
        }
        return true;
    }
}

上面的示例代碼展示了在分開的線程用獨立的SearchRunnable類去運行搜索請求。這個技巧是從正在阻塞的主線程保持了潛在的慢運行請求。


下一節(jié): 創(chuàng)建TV游戲應(yīng)用 >


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號