Pozostała zgodność wsteczna

Wypróbuj Compose
Jetpack Compose to zalecany zestaw narzędzi do tworzenia interfejsu na Androidzie. Dowiedz się, jak dodać funkcję wyszukiwania w Compose.

SearchView i pasek działań są dostępne tylko na Androidzie 3.0 lub nowszym. Aby obsługiwać starsze platformy, możesz wrócić do okna wyszukiwania. Okno wyszukiwania to interfejs dostarczany przez system, który po wywołaniu nakłada się na aplikację.

Ustawianie minimalnego i docelowego poziomu interfejsu API

Aby skonfigurować okno wyszukiwania, najpierw zadeklaruj w manifeście, że chcesz obsługiwać starsze urządzenia, ale chcesz kierować aplikację na Androida 3.0 lub nowszego. Gdy to zrobisz, aplikacja automatycznie używa paska działań na Androidzie 3.0 lub nowszym oraz tradycyjnego systemu menu na starszych urządzeniach:

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

<application>
...

Udostępnianie okna wyszukiwania na starszych urządzeniach

Aby wywołać okno wyszukiwania na starszych urządzeniach, wywołaj onSearchRequested() za każdym razem, gdy użytkownik wybierze element menu wyszukiwania z menu opcji. Ponieważ urządzenia z Androidem 3.0 i nowszym wyświetlają SearchView na pasku działań (jak pokazano w pierwszej lekcji), tylko wersje starsze niż 3.0 wywołują onOptionsItemSelected() gdy użytkownik wybierze element menu wyszukiwania.

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;
    }
}

Sprawdzanie wersji Androida w czasie działania

W czasie działania sprawdź wersję urządzenia, aby upewnić się, że na starszych urządzeniach nie wystąpi nieobsługiwane użycie SearchView. W naszym przykładowym kodzie dzieje się to w metodzie 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;
}