ผู้ใช้มักจะมีเนื้อหาที่เฉพาะเจาะจงอยู่ในใจเมื่อใช้แอปสื่อบนทีวี หากแอปของคุณมี แคตตาล็อกเนื้อหาขนาดใหญ่ การเรียกดูเนื้อหาที่ต้องการ อาจไม่ใช่วิธีที่มีประสิทธิภาพที่สุด ทำให้ผู้ใช้พบสิ่งที่กำลังมองหาได้ อินเทอร์เฟซการค้นหาช่วยให้ผู้ใช้ไปยัง เนื้อหาที่ต้องการได้รวดเร็วกว่าการเรียกดู
ไลบรารี androidx.leanback มีชุดชั้นเรียนสำหรับเปิดใช้อินเทอร์เฟซการค้นหามาตรฐาน ไว้ในแอปที่สอดคล้องกับฟังก์ชันการค้นหาอื่นๆ ในทีวีและมอบฟีเจอร์ต่างๆ เช่น ป้อนข้อมูลด้วยเสียง
คู่มือนี้จะกล่าวถึงวิธีการให้บริการอินเทอร์เฟซการค้นหาในแอปของคุณโดยใช้การสนับสนุน Leanback ชั้นเรียนห้องสมุด
เพิ่มการดำเนินการค้นหา
เมื่อคุณใช้คลาส BrowseFragment
สำหรับสื่อ
คุณสามารถเปิดใช้งานอินเทอร์เฟซการค้นหา
เป็นส่วนมาตรฐานของผู้ใช้
ของ Google อินเทอร์เฟซการค้นหาเป็นไอคอนที่ปรากฏในเลย์เอาต์เมื่อคุณตั้งค่า 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
ที่เรียกใช้คําค้นหาในชุดข้อความแยกต่างหาก เทคนิคนี้ยังอาจทำงานช้า
ไม่ให้บล็อกเทรดหลักของอินเทอร์เฟซผู้ใช้ได้