Configurar a interface de pesquisa

Recomendamos o uso do SearchView como um item na barra de apps para fornecer a funcionalidade de pesquisa no seu app. Conforme com todos os itens na barra de apps, você pode definir o SearchView para seja mostrado em todos os momentos ou apenas quando houver espaço. Também é possível defini-lo como um ação recolhível, que mostra o SearchView como um ícone. inicialmente e ocupa toda a barra de apps como um campo de pesquisa quando o usuário toca no ícone.

Adicionar o SearchView à barra de apps

Para adicionar um widget SearchView à barra de apps, crie um arquivo no projeto chamado res/menu/options_menu.xml e adicione o seguinte código ao arquivo. Esse código define como criar o item de pesquisa, como o ícone usar e o título do item. O atributo collapseActionView permite que o SearchView se expanda para ocupar toda a barra de apps e voltar para um item normal da barra de apps quando não estiver em uso. Devido à espaço limitado da barra de aplicativos em aparelhos celulares, recomendamos o uso do Atributo collapsibleActionView para oferecer uma experiência melhor ao usuário do usuário.

<?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>

Se quiser um ícone de pesquisa mais acessível, crie um ic_search.xml na pasta /res/drawable e inclua o seguinte código nele:

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

Para mostrar o SearchView na barra de apps, infle o menu XML recurso res/menu/options_menu.xml na onCreateOptionsMenu() da sua atividade:

Kotlin

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

    return true
}

A execução do app gera algo assim:

Uma imagem mostrando uma tela vazia com um ícone de pesquisa na barra superior do app
Figura 1. Um ícone de pesquisa na barra superior de apps.

O SearchView aparece na barra de apps do app, mas não é funcional. Ao tocar no ícone de pesquisa, você verá algo como:

Uma imagem mostrando a visualização de pesquisa em ação
Figura 2. SearchView em ação.

Para tornar o SearchView funcional, você precisa definir como o SearchView se comporta.

Criar uma configuração de pesquisa

Uma pesquisa configuration especifica como a SearchView se comporta e é definida em um arquivo res/xml/searchable.xml. Uma configuração de pesquisa precisa conter, no mínimo, um atributo android:label que tenha o mesmo valor que o atributo android:label do <aplicativo> ou <activity> no manifesto do Android. No entanto, também recomendamos adicionar um Atributo android:hint para dar ao usuário uma ideia do que inserir na caixa de pesquisa.

<?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" />

No arquivo de manifesto do app, declare um <meta-data> que aponta para o arquivo res/xml/searchable.xml. Declare o em uma <activity> em que você quer mostrar 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>

No método onCreateOptionsMenu() que você criar, associe a configuração de pesquisa com SearchView, chamando 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
}

A chamada para getSearchableInfo() recebe um SearchableInfo que é criado a partir do arquivo XML de configuração de pesquisa. Quando a pesquisa está associada corretamente ao SearchView e ao o usuário envia uma consulta, o SearchView inicia uma atividade com o ACTION_SEARCH intenção. Em seguida, você precisa de uma atividade que possa filtrar essa intent e processar o consulta de pesquisa.

Criar uma atividade de pesquisa

Uma atividade pesquisável filtra a intent ACTION_SEARCH e procura a consulta em um conjunto de dados. Para criar uma atividade de pesquisa, declare uma atividade de sua escolha para filtrar o ACTION_SEARCH intent:

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

Na sua atividade de pesquisa, processe a intent ACTION_SEARCH ao verificando isso no 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")
        }
    }
}

Agora, o SearchView pode aceitar a consulta do usuário e iniciar a atividade pesquisável com a intent ACTION_SEARCH.

Depois de obter a consulta de pesquisa, você pode passá-la para o ViewModel, em que ele pode ser usado em outras camadas do para recuperar os resultados da pesquisa a serem exibidos.