Konfigurowanie interfejsu wyszukiwania

Zalecamy użycie metody SearchView jako element na pasku aplikacji, który udostępnia funkcję wyszukiwania w aplikacji. Jako mając wszystkie elementy na pasku aplikacji, możesz określić wymiar SearchView, by wyświetlane przez cały czas lub tylko wtedy, gdy jest wystarczająco dużo miejsca. Możesz też zdefiniować go jako działanie zwijane, w którym SearchView jest ikoną a potem zajmuje cały pasek aplikacji jako pole wyszukiwania, kliknij ją.

Dodaj SearchView do paska aplikacji

Aby dodać widżet SearchView do paska aplikacji, utwórz plik w projekt o nazwie res/menu/options_menu.xml i dodaj ten kod do pliku. Ten kod określa sposób tworzenia elementu wyszukiwania, np. ikony oraz tytuł produktu. Atrybut collapseActionView SearchView może rozwinąć się i zająć cały pasek aplikacji, zwinięty z powrotem do normalnego elementu na pasku aplikacji, gdy nie jest używany. Z powodu na pasku aplikacji jest ograniczone miejsce, zalecamy korzystanie z Atrybut collapsibleActionView, aby zapewnić użytkownikom lepsze wrażenia i uzyskiwanie dodatkowych informacji.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
        android:title="@string/search_title"
        android:icon="@drawable/ic_search"
        android:showAsAction="collapseActionView|ifRoom"
        android:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>

Jeśli chcesz, aby ikona wyszukiwania była łatwiejsza w obsłudze, utwórz ic_search.xml plik w folderze /res/drawable i umieść w nim ten kod:

<vector
    android:height="24dp"
    android:tint="#000000"
    android:viewportHeight="24"
    android:viewportWidth="24"
    android:width="24dp"
    xmlns:android="http://schemas.android.com/apk/res/android">
        <path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
</vector>

Aby wyświetlić SearchView na pasku aplikacji, rozszerz menu XML zasób res/menu/options_menu.xml w onCreateOptionsMenu() metoda Twojej aktywności:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    return true
}

Po uruchomieniu aplikacji wygląda to mniej więcej tak:

Obraz pokazujący pusty ekran z ikoną wyszukiwania na górnym pasku aplikacji
Rysunek 1. Ikona wyszukiwania na górnym pasku aplikacji.

Ikona SearchView jest widoczna na pasku aplikacji, ale wcale nie jest i funkcjonalność. Po kliknięciu ikony wyszukiwania pojawi się komunikat podobny do tego:

Ilustracja pokazująca działanie widoku wyszukiwania
Rysunek 2. SearchView w akcji.

Aby interfejs SearchView działał poprawnie, musisz określić, jak Zachowuje się SearchView.

Tworzenie konfiguracji wyszukiwania

Wyszukiwanie określa działanie parametru SearchView i zdefiniowane w pliku res/xml/searchable.xml. Konfiguracja wyszukiwania musi zawierać co najmniej atrybut android:label z atrybutem tej samej wartości co atrybut android:label atrybutu <aplikacja> lub <activity> w pliku manifestu Androida. Zalecamy jednak dodanie atrybutu Atrybut android:hint, który informuje użytkownika, co wpisać w polu wyszukiwania.

<?xml version="1.0" encoding="utf-8"?>

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="@string/search_hint" />

W pliku manifestu aplikacji zadeklaruj parametr <meta-data> wskazujący plik res/xml/searchable.xml. Zadeklaruj parametr w elemencie <activity>, w którym chcesz wyświetlać SearchView

<activity
android:name=".SearchResultsActivity"
android:exported="false"
android:label="@string/title_activity_search_results"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat.Light">
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>

W utworzonej przez siebie metodzie onCreateOptionsMenu() powiąż konfiguracji wyszukiwania za pomocą funkcji SearchView przez wywołanie setSearchableInfo(SearchableInfo):

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    val searchView = menu.findItem(R.id.search).actionView as SearchView
    val component = ComponentName(this, SearchResultsActivity::class.java)
    val searchableInfo = searchManager.getSearchableInfo(component)
    searchView.setSearchableInfo(searchableInfo)
    return true
}

Wezwanie do działania getSearchableInfo() uzyskuje SearchableInfo utworzony na podstawie pliku XML konfiguracji wyszukiwania. Gdy wyszukiwanie jest prawidłowo powiązana z SearchView i użytkownik przesyła zapytanie, SearchView rozpoczyna działanie z tagiem ACTION_SEARCH intencji. Potrzebujesz działania, które może filtrować tę intencję i obsługiwać wyszukiwanego hasła.

Tworzenie aktywności, którą można przeszukiwać

Filtry aktywności dostępne do przeszukiwania dla intencji ACTION_SEARCH i wyszukanie hasła w zbiorze danych. Aby utworzyć aktywność do przeszukiwania, zadeklaruj aktywność, którą chcesz przefiltrować w celu wyświetlenia danych z kategorii ACTION_SEARCH intencja:

<activity android:name=".SearchResultsActivity" ... >
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    ...
</activity>

W aktywności możliwej do wyszukiwania obsługuje intencję ACTION_SEARCH przez sprawdzając to na onCreate() .

Kotlin

class SearchResultsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search_results)
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_SEARCH == intent.action) {
            val query = intent.getStringExtra(SearchManager.QUERY)
            Log.d("SEARCH", "Search query was: $query")
        }
    }
}

Teraz SearchView może zaakceptować zapytanie użytkownika i uruchomić Twoją aktywność, którą można przeszukiwać z intencją ACTION_SEARCH.

Po otrzymaniu wyszukiwanego hasła możesz przesłać je do ViewModel, gdzie można go używać w innych warstwach do pobierania wyników wyszukiwania do wyświetlenia.