Arama arayüzünü ayarlama

Uygulamanızda arama işlevselliği sağlamak için SearchView widget'ını uygulama çubuğunda bir öğe olarak kullanmanızı öneririz. Uygulama çubuğundaki tüm öğelerde olduğu gibi, SearchView öğesini her zaman veya yalnızca yer olduğunda gösterilecek şekilde tanımlayabilirsiniz. Bunu, başlangıçta SearchView simgesini simge olarak gösteren ve daha sonra kullanıcı simgeye dokunduğunda uygulama çubuğunun tamamını arama alanı olarak kaplayan daraltılabilir işlem olarak da tanımlayabilirsiniz.

SearchView'u uygulama çubuğuna ekleyin

Uygulama çubuğuna SearchView widget'ı eklemek için projenizde res/menu/options_menu.xml adlı bir dosya oluşturun ve aşağıdaki kodu dosyaya ekleyin. Bu kod, kullanılacak simge ve öğenin başlığı gibi arama öğesinin nasıl oluşturulacağını tanımlar. collapseActionView özelliği, SearchView öğenizin kullanılmadığında tüm uygulama çubuğunu kaplayacak ve tekrar normal bir uygulama çubuğu öğesine dönüşecek şekilde genişlemesini sağlar. Mobil cihazlarda uygulama çubuğu sınırlı olduğundan, daha iyi bir kullanıcı deneyimi sağlamak için collapsibleActionView özelliğini kullanmanızı öneririz.

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

Daha erişilebilir bir arama simgesi istiyorsanız /res/drawable klasöründe bir ic_search.xml dosyası oluşturun ve aşağıdaki kodu bu dosyaya ekleyin:

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

Uygulama çubuğunda SearchView simgesini görüntülemek için etkinliğinizin onCreateOptionsMenu() yöntemindeki XML menü kaynağını res/menu/options_menu.xml şişirin:

Kotlin

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

    return true
}

Uygulamayı çalıştırdığınızda şöyle bir şey oluşur:

Uygulamanın üst çubuğunda arama simgesiyle birlikte boş bir ekranı gösteren resim
Şekil 1. Uygulamanın üst çubuğunda arama simgesi

SearchView, uygulamanızın uygulama çubuğunda görünür ancak çalışmaz. Arama simgesine dokunursanız şuna benzer bir şey görürsünüz:

Arama görünümünü çalışırken gösteren resim
Şekil 2. SearchView iş başında.

SearchView öğesini işlevsel hale getirmek için SearchView özelliğinin nasıl davrandığını tanımlamanız gerekir.

Arama yapılandırması oluşturma

Arama yapılandırması, SearchView işlevinin nasıl davranacağını belirtir ve bir res/xml/searchable.xml dosyasında tanımlanır. Bir arama yapılandırması en az, Android manifestinizdeki <application> veya <activity> öğesinin android:label özelliğiyle aynı değere sahip bir android:label özelliği içermelidir. Ancak, kullanıcıya arama kutusuna ne gireceği konusunda fikir vermek için android:hint özelliği de eklemenizi öneririz.

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

Uygulamanızın manifest dosyasında, res/xml/searchable.xml dosyasına işaret eden bir <meta-data> öğesi tanımlayın. SearchView içinde görüntülemek istediğiniz öğeyi <activity> içinde tanımlayın.

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

Oluşturduğunuz onCreateOptionsMenu() yönteminde, setSearchableInfo(SearchableInfo) yöntemini çağırarak arama yapılandırmasını SearchView ile ilişkilendirin:

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
}

getSearchableInfo() çağrısı, arama yapılandırması XML dosyasından oluşturulan bir SearchableInfo nesnesi elde eder. Arama yapılandırması SearchView ile doğru şekilde ilişkilendirildiğinde ve kullanıcı bir sorgu gönderdiğinde SearchView, ACTION_SEARCH amacına sahip bir etkinlik başlatır. Ardından, bu niyet için filtreleyebilecek ve arama sorgusunu işleyebilen bir etkinlik gerekir.

Aranabilir bir etkinlik oluşturma

ACTION_SEARCH amacı için aranabilir etkinlik filtreleridir ve sorguyu bir veri kümesinde arar. Aranabilir bir etkinlik oluşturmak için ACTION_SEARCH amacına göre filtrelemek üzere istediğiniz bir etkinliği beyan edin:

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

Aranabilir etkinliğinizde, ACTION_SEARCH amacını onCreate() yönteminizde kontrol ederek yönetin.

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")
        }
    }
}

Artık SearchView kullanıcının sorgusunu kabul edebilir ve ACTION_SEARCH amacıyla aranabilir etkinliğinizi başlatabilir.

Arama sorgusunu aldıktan sonra, bu sorguyu ViewModel'a iletebilirsiniz. Burada, görüntülenecek arama sonuçlarını almak için bu sorguyu mimarinizin diğer katmanlarında kullanabilirsiniz.