Arama arayüzünü ayarlama

Oluşturma yöntemini deneyin
Android için önerilen kullanıcı arayüzü araç seti Jetpack Compose'dur. Oluştur'a nasıl arama işlevi ekleyeceğinizi öğrenin.

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

SearchView'ı uygulama çubuğuna ekleme

Uygulama çubuğuna SearchView widget eklemek için projenizde res/menu/options_menu.xml adlı bir dosya oluşturun ve dosyaya aşağıdaki kodu ekleyin. Bu kod, arama öğesinin nasıl oluşturulacağını (ör. kullanılacak simge ve öğenin başlığı) tanımlar. collapseActionView özelliği, SearchView öğenizin uygulama çubuğunun tamamını kaplayacak şekilde genişlemesini ve kullanılmadığında normal bir uygulama çubuğu öğesine küçülmesini sağlar. Cep telefonu cihazlardaki sınırlı uygulama çubuğu alanı nedeniyle daha iyi bir kullanıcı deneyimi sunmak 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 dosyaya aşağıdaki kodu 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önteminde XML menü kaynağını res/menu/options_menu.xml genişletin:

Kotlin

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

    return true
}

Uygulamayı çalıştırdığınızda aşağıdaki gibi bir sonuç elde edersiniz:

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

SearchView, uygulamanızın uygulama çubuğunda görünüyor ancak işlevsel değil. Arama simgesine dokunduğunuzda aşağıdaki gibi bir görünümle karşılaşırsınız:

Arama görünümünün kullanıldığını gösteren resim
Şekil 2. SearchView

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

Arama yapılandırması oluşturma

Arama yapılandırması, SearchView'nin nasıl davrandığını belirtir ve bir res/xml/searchable.xml dosyasında tanımlanır. Bir arama yapılandırması, Android manifest'inizdeki <application> veya <activity> öğesinin android:label özelliğiyle aynı değere sahip en az bir android:label özelliği içermelidir. Ancak kullanıcıya arama kutusuna ne gireceği hakkında fikir vermek için bir android:hint özelliği eklemenizi de ö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ını işaret eden bir <meta-data> öğesi beyan edin. Öğeyi, SearchView öğesini göstermek istediğiniz bir <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)'yi ç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 alır. Arama yapılandırması SearchView ile doğru şekilde ilişkilendirildiğinde ve kullanıcı bir sorgu gönderdiğinde SearchView, ACTION_SEARCH intent'iyle bir etkinlik başlatır. Ardından, bu intent için filtre uygulayabilecek ve arama sorgusunu işleyebilecek bir etkinliğe ihtiyacınız vardır.

Aralanabilir etkinlik oluşturma

Aralanabilir etkinlik, ACTION_SEARCH amacını filtreler ve sorguyu bir veri kümesinde arar. Aralanabilir bir etkinlik oluşturmak için ACTION_SEARCHintent'ine göre filtrelemek üzere seçtiğiniz bir etkinliği bildirin:

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

Aralanabilir etkinliğinizde, ACTION_SEARCH intent'ini onCreate() yönteminizde kontrol ederek işleyin.

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 intent'iyle aranabilir etkinliğinizi başlatabilir.

Arama sorgusunu aldıktan sonra ViewModel'e iletebilirsiniz. Burada, gösterilecek arama sonuçlarını almak için mimarinizin diğer katmanlarında kullanabilirsiniz.