การทำงานแบบย้อนหลังที่เหลืออยู่

SearchView และแถบการดำเนินการใช้ได้เฉพาะใน Android 3.0 และ ในภายหลัง หากต้องการรองรับแพลตฟอร์มเก่า ให้กลับไปที่กล่องโต้ตอบการค้นหา กล่องโต้ตอบการค้นหาคือ ซึ่งระบบได้ให้ UI ซึ่งวางซ้อนบนแอปพลิเคชันเมื่อเรียกใช้

กำหนดระดับ API ต่ำสุดและระดับเป้าหมาย

หากต้องการตั้งค่ากล่องโต้ตอบการค้นหา ให้ประกาศในไฟล์ Manifest ก่อนว่าคุณต้องการรองรับไฟล์เวอร์ชันเก่า อุปกรณ์ แต่ต้องการกำหนดเป้าหมายเป็น Android 3.0 หรือรุ่นใหม่กว่านั้น เมื่อคุณทำเช่นนี้ แอปพลิเคชันของคุณ จะใช้แถบการทำงานบน Android 3.0 ขึ้นไปโดยอัตโนมัติและใช้ระบบเมนูแบบดั้งเดิมใน อุปกรณ์รุ่นเก่า:

<uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />

<application>
...

มีกล่องโต้ตอบการค้นหาสำหรับอุปกรณ์รุ่นเก่า

หากต้องการเรียกใช้กล่องโต้ตอบการค้นหาในอุปกรณ์รุ่นเก่า ให้โทรหา onSearchRequested() เมื่อใดก็ตามที่ผู้ใช้เลือกการค้นหา จากเมนูตัวเลือก เนื่องจากอุปกรณ์ที่ใช้ Android 3.0 ขึ้นไปจะแสดง SearchView ในแถบการดำเนินการ (ตามที่แสดงในบทเรียนแรก) เฉพาะเวอร์ชัน ที่เก่ากว่า 3.0 จะโทรหา onOptionsItemSelected() เมื่อ ผู้ใช้เลือกรายการในเมนูการค้นหา

Kotlin

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    return when (item.itemId) {
        R.id.search -> {
            onSearchRequested()
            true
        }
        else -> false
    }
}

Java

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.search:
            onSearchRequested();
            return true;
        default:
            return false;
    }
}

ตรวจสอบเวอร์ชันบิลด์ของ Android ในรันไทม์

ขณะรันไทม์ ให้ตรวจสอบเวอร์ชันของอุปกรณ์เพื่อให้แน่ใจว่าจะไม่มีการใช้ SearchView ที่ไม่รองรับในอุปกรณ์รุ่นเก่า ในโค้ดตัวอย่างของเรา จะเกิดขึ้นใน เมธอด onCreateOptionsMenu():

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {

    menuInflater.inflate(R.menu.options_menu, menu)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
        (menu.findItem(R.id.search).actionView as SearchView).apply {
            setSearchableInfo(searchManager.getSearchableInfo(componentName))
            setIconifiedByDefault(false)
        }
    }
    return true
}

Java

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);
    }
    return true;
}