टीवी ऐप्लिकेशन में खोजना

आम तौर पर, टीवी पर मीडिया ऐप्लिकेशन इस्तेमाल करते समय, उपयोगकर्ताओं के दिमाग में कोई खास कॉन्टेंट होता है. अगर आपके ऐप्लिकेशन में कॉन्टेंट का बड़ा कैटलॉग है, तो किसी खास टाइटल को ब्राउज़ करना, उपयोगकर्ताओं के लिए वह कॉन्टेंट ढूंढने का सबसे कारगर तरीका नहीं हो सकता जो वे ढूंढ रहे हैं. खोज के लिए इंटरफ़ेस की मदद से, आपके उपयोगकर्ता ब्राउज़ करने के मुकाबले तेज़ी से वह कॉन्टेंट ढूंढ सकते हैं जो उन्हें चाहिए.

androidx.leanback लाइब्रेरी, क्लास का एक सेट उपलब्ध कराती है. इसकी मदद से, आपके ऐप्लिकेशन में खोज के लिए एक स्टैंडर्ड इंटरफ़ेस जोड़ा जा सकता है. यह इंटरफ़ेस, टीवी पर खोज की अन्य सुविधाओं के साथ काम करता है. साथ ही, इसमें बोलकर इनपुट देने जैसी सुविधाएं भी मिलती हैं.

इस गाइड में, Leanback सपोर्ट लाइब्रेरी की क्लास का इस्तेमाल करके, अपने ऐप्लिकेशन में खोज के लिए इंटरफ़ेस जोड़ने का तरीका बताया गया है.

खोज की सुविधा जोड़ना

मीडिया ब्राउज़ करने के लिए इंटरफ़ेस बनाने के लिए, BrowseFragment क्लास का इस्तेमाल करने पर, खोज के लिए इंटरफ़ेस को उपयोगकर्ता इंटरफ़ेस के स्टैंडर्ड हिस्से के तौर पर जोड़ा जा सकता है. खोज के लिए इंटरफ़ेस, एक आइकॉन होता है. जब View.OnClickListener को BrowseFragment ऑब्जेक्ट पर सेट किया जाता है, तब यह आइकॉन लेआउट में दिखता है. इस तकनीक को समझने के लिए, यहां एक सैंपल कोड दिया गया है.

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 क्लास के साथ इस्तेमाल किया जाता है. यह क्लास, खोज की क्वेरी को अलग थ्रेड पर चलाती है. इस तकनीक से, धीरे चलने वाली क्वेरी को मुख्य उपयोगकर्ता इंटरफ़ेस थ्रेड को ब्लॉक करने से रोका जा सकता है.