টিভি অ্যাপের মধ্যে অনুসন্ধান করুন
সেভ করা পৃষ্ঠা গুছিয়ে রাখতে 'সংগ্রহ' ব্যবহার করুন
আপনার পছন্দ অনুযায়ী কন্টেন্ট সেভ করুন ও সঠিক বিভাগে রাখুন।
টিভিতে মিডিয়া অ্যাপ ব্যবহার করার সময় ব্যবহারকারীদের প্রায়শই নির্দিষ্ট বিষয়বস্তু মনে থাকে। যদি আপনার অ্যাপে কন্টেন্টের একটি বড় ক্যাটালগ থাকে, তাহলে একটি নির্দিষ্ট শিরোনামের জন্য ব্রাউজ করা ব্যবহারকারীদের জন্য তারা যা খুঁজছেন তা খুঁজে পাওয়ার সবচেয়ে কার্যকর উপায় নাও হতে পারে। একটি অনুসন্ধান ইন্টারফেস আপনার ব্যবহারকারীদের ব্রাউজ করার চেয়ে দ্রুততর সামগ্রী পেতে সাহায্য করতে পারে।
androidx.leanback লাইব্রেরি আপনার অ্যাপের মধ্যে একটি স্ট্যান্ডার্ড সার্চ ইন্টারফেস সক্ষম করতে ক্লাসের একটি সেট প্রদান করে যা টিভিতে অন্যান্য সার্চ ফাংশনের সাথে সামঞ্জস্যপূর্ণ এবং ভয়েস ইনপুটের মতো বৈশিষ্ট্য প্রদান করে।
Leanback সমর্থন লাইব্রেরি ক্লাস ব্যবহার করে কিভাবে আপনার অ্যাপে একটি সার্চ ইন্টারফেস প্রদান করবেন এই গাইডটি আলোচনা করে।
একটি অনুসন্ধান কর্ম যোগ করুন
আপনি যখন মিডিয়া ব্রাউজিং ইন্টারফেসের জন্য BrowseFragment
ক্লাস ব্যবহার করেন, আপনি ব্যবহারকারী ইন্টারফেসের একটি আদর্শ অংশ হিসাবে একটি অনুসন্ধান ইন্টারফেস সক্ষম করতে পারেন। অনুসন্ধান ইন্টারফেস হল একটি আইকন যা লেআউটে প্রদর্শিত হয় যখন আপনি BrowseFragment
অবজেক্টে View.OnClickListener
সেট করেন। নিম্নলিখিত নমুনা কোড এই কৌশল প্রদর্শন করে.
কোটলিন
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());
}
দ্রষ্টব্য: আপনি setSearchAffordanceColor(int)
পদ্ধতি ব্যবহার করে অনুসন্ধান আইকনের রঙ সেট করতে পারেন।
একটি অনুসন্ধান ইনপুট এবং ফলাফল যোগ করুন
যখন একজন ব্যবহারকারী অনুসন্ধান আইকন নির্বাচন করেন, সিস্টেমটি সংজ্ঞায়িত অভিপ্রায় ব্যবহার করে একটি অনুসন্ধান কার্যকলাপ আহ্বান করে। আপনার অনুসন্ধান কার্যকলাপের জন্য, একটি SearchFragment
ধারণকারী একটি রৈখিক বিন্যাস ব্যবহার করুন। অনুসন্ধানের ফলাফল প্রদর্শন করতে এই খণ্ডটিকে অবশ্যই SearchFragment.SearchResultProvider
ইন্টারফেস প্রয়োগ করতে হবে।
নিম্নলিখিত কোড নমুনা দেখায় কিভাবে একটি অনুসন্ধান ইন্টারফেস এবং ফলাফল প্রদান করতে SearchFragment
ক্লাস প্রসারিত করতে হয়:
কোটলিন
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
ক্লাসের সাথে ব্যবহার করা বোঝায় যা একটি পৃথক থ্রেডে অনুসন্ধান ক্যোয়ারী চালায়। এই কৌশলটি সম্ভাব্যভাবে ধীর গতিতে চলমান প্রশ্নগুলিকে প্রধান ব্যবহারকারী ইন্টারফেস থ্রেড ব্লক করা থেকে রাখে।
এই পৃষ্ঠার কন্টেন্ট ও কোডের নমুনাগুলি Content License-এ বর্ণিত লাইসেন্সের অধীনস্থ। Java এবং OpenJDK হল Oracle এবং/অথবা তার অ্যাফিলিয়েট সংস্থার রেজিস্টার্ড ট্রেডমার্ক।
2025-07-29 UTC-তে শেষবার আপডেট করা হয়েছে।
[[["সহজে বোঝা যায়","easyToUnderstand","thumb-up"],["আমার সমস্যার সমাধান হয়েছে","solvedMyProblem","thumb-up"],["অন্যান্য","otherUp","thumb-up"]],[["এতে আমার প্রয়োজনীয় তথ্য নেই","missingTheInformationINeed","thumb-down"],["খুব জটিল / অনেক ধাপ","tooComplicatedTooManySteps","thumb-down"],["পুরনো","outOfDate","thumb-down"],["অনুবাদ সংক্রান্ত সমস্যা","translationIssue","thumb-down"],["নমুনা / কোড সংক্রান্ত সমস্যা","samplesCodeIssue","thumb-down"],["অন্যান্য","otherDown","thumb-down"]],["2025-07-29 UTC-তে শেষবার আপডেট করা হয়েছে।"],[],[],null,["# Search within TV apps\n\nUsers frequently have specific content in mind when using a media app on TV. If your app contains\na large catalog of content, browsing for a specific title might not be the most efficient way for\nusers to find what they are looking for. A search interface can help your users get to the\ncontent they want faster than browsing.\n\n\nThe [androidx.leanback library](/training/tv/get-started/create#leanback) provides a set of classes to enable a standard search interface\nwithin your app that is consistent with other search functions on TV and provides features like\nvoice input.\n\n\nThis guide discusses how to provide a search interface in your app using Leanback support\nlibrary classes.\n\nAdd a search action\n-------------------\n\n\nWhen you use the [BrowseFragment](/reference/androidx/leanback/app/BrowseFragment) class for a media\nbrowsing interface, you can enable a search interface as a standard part of the user\ninterface. The search interface is an icon that appears in the layout when you set [View.OnClickListener](/reference/android/view/View.OnClickListener) on the `BrowseFragment`\nobject. The following sample code demonstrates this technique. \n\n### Kotlin\n\n```kotlin\noverride fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n setContentView(R.layout.browse_activity)\n browseFragment = fragmentManager.findFragmentById(R.id.browse_fragment) as BrowseFragment\n browseFragment.setOnSearchClickedListener { view -\u003e\n val intent = Intent(this@BrowseActivity, SearchActivity::class.java)\n startActivity(intent)\n }\n\n browseFragment.setAdapter(buildAdapter())\n}\n```\n\n### Java\n\n```java\n@Override\npublic void onCreate(Bundle savedInstanceState) {\n super.onCreate(savedInstanceState);\n setContentView(R.layout.browse_activity);\n\n browseFragment = (BrowseFragment)\n getFragmentManager().findFragmentById(R.id.browse_fragment);\n\n ...\n\n browseFragment.setOnSearchClickedListener(new View.OnClickListener() {\n @Override\n public void onClick(View view) {\n Intent intent = new Intent(BrowseActivity.this, SearchActivity.class);\n startActivity(intent);\n }\n });\n\n browseFragment.setAdapter(buildAdapter());\n}\n```\n\n\n**Note:** You can set the color of the search icon using the\n[setSearchAffordanceColor(int)](/reference/androidx/leanback/app/BrandedFragment#setSearchAffordanceColor(int))\nmethod.\n\nAdd a search input and results\n------------------------------\n\n\nWhen a user selects the search icon, the system invokes a search activity using the\ndefined intent. For your search activity, use a linear layout containing a\n[SearchFragment](/reference/androidx/leanback/app/SearchFragment).\nThis fragment must also implement the [SearchFragment.SearchResultProvider](/reference/androidx/leanback/app/SearchFragment.SearchResultProvider)\ninterface to display the results of a search.\n\n\nThe following code sample shows how to extend the `SearchFragment` class\nto provide a search interface and results: \n\n### Kotlin\n\n```kotlin\nclass MySearchFragment : SearchFragment(), SearchFragment.SearchResultProvider {\n private val rowsAdapter = ArrayObjectAdapter(ListRowPresenter())\n private val handler = Handler()\n private val delayedLoad = SearchRunnable()\n\n val resultsAdapter: ObjectAdapter\n get() {\n return rowsAdapter\n }\n\n override fun onCreate(savedInstanceState: Bundle?) {\n super.onCreate(savedInstanceState)\n setSearchResultProvider(this)\n setOnItemClickedListener(getDefaultItemClickedListener())\n }\n\n fun onQueryTextChange(newQuery: String): Boolean {\n rowsAdapter.clear()\n if (!TextUtils.isEmpty(newQuery)) {\n delayedLoad.setSearchQuery(newQuery)\n handler.removeCallbacks(delayedLoad)\n handler.postDelayed(delayedLoad, SEARCH_DELAY_MS)\n }\n return true\n }\n\n fun onQueryTextSubmit(query: String): Boolean {\n rowsAdapter.clear()\n if (!TextUtils.isEmpty(query)) {\n delayedLoad.setSearchQuery(query)\n handler.removeCallbacks(delayedLoad)\n handler.postDelayed(delayedLoad, SEARCH_DELAY_MS)\n }\n return true\n }\n\n companion object {\n private val SEARCH_DELAY_MS = 300\n }\n}\n```\n\n### Java\n\n```java\npublic class MySearchFragment extends SearchFragment\n implements SearchFragment.SearchResultProvider {\n\n private static final int SEARCH_DELAY_MS = 300;\n private ArrayObjectAdapter rowsAdapter;\n private Handler handler = new Handler();\n private SearchRunnable delayedLoad;\n\n @Override\n public void onCreate(Bundle savedInstanceState) {\n super.onCreate(savedInstanceState);\n\n rowsAdapter = new ArrayObjectAdapter(new ListRowPresenter());\n setSearchResultProvider(this);\n setOnItemClickedListener(getDefaultItemClickedListener());\n delayedLoad = new SearchRunnable();\n }\n\n @Override\n public ObjectAdapter getResultsAdapter() {\n return rowsAdapter;\n }\n\n @Override\n public boolean onQueryTextChange(String newQuery) {\n rowsAdapter.clear();\n if (!TextUtils.isEmpty(newQuery)) {\n delayedLoad.setSearchQuery(newQuery);\n handler.removeCallbacks(delayedLoad);\n handler.postDelayed(delayedLoad, SEARCH_DELAY_MS);\n }\n return true;\n }\n\n @Override\n public boolean onQueryTextSubmit(String query) {\n rowsAdapter.clear();\n if (!TextUtils.isEmpty(query)) {\n delayedLoad.setSearchQuery(query);\n handler.removeCallbacks(delayedLoad);\n handler.postDelayed(delayedLoad, SEARCH_DELAY_MS);\n }\n return true;\n }\n}\n```\n\n\nThe previous example code is meant to be used with a `SearchRunnable` class\nthat runs the search query on a separate thread. This technique keeps potentially slow-running\nqueries from blocking the main user interface thread."]]