Arama arayüzünü ayarlama

Compose yöntemini deneyin
Jetpack Compose, Android için önerilen kullanıcı arayüzü araç setidir. Compose'da arama işlevselliği eklemeyi öğrenin.

Uygulamanızda arama işlevi sağlamak için uygulama çubuğunda SearchView öğesini kullanmanızı öneririz. Uygulama çubuğundaki tüm öğelerde olduğu gibi, SearchView öğesinin her zaman veya yalnızca yer olduğunda gösterilmesini sağlayabilirsiniz. Ayrıca, başlangıçta simge olarak SearchView simgesini gösteren ve kullanıcı simgeye dokunduğunda arama alanı olarak tüm uygulama çubuğunu 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, kullanılacak simge ve öğenin başlığı gibi arama öğesinin nasıl oluşturulacağını tanımlar. collapseActionView özelliği, SearchView öğenizin tüm uygulama çubuğunu kaplayacak şekilde genişlemesini ve kullanılmadığında normal bir uygulama çubuğu öğesine geri daralmasını sağlar. Cep telefonu cihazlarındaki uygulama çubuğu alanı sınırlı olduğundan 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 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 öğesini 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ırmak aşağıdaki gibi bir sonuç üretir:

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

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

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

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

Arama yapılandırması oluşturma

Arama yapılandırması, SearchView öğesinin nasıl davranacağını belirtir ve res/xml/searchable.xml dosyasında tanımlanır. Bir arama yapılandırması, Android manifestinizdeki <application> veya <activity> öğesinin android:label özelliğiyle aynı değere sahip olan en az bir android:label özelliği içermelidir. Ancak, kullanıcıya arama kutusuna ne gireceği konusunda 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 manifesto dosyasında, res/xml/searchable.xml dosyasına işaret eden bir <meta-data> öğesi tanımlayın. <activity> öğesini, SearchView öğesini göstermek istediğiniz bir <activity> içinde bildirin.

<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)'ı ç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() SearchableInfo çağrısı, arama yapılandırması XML dosyasından oluşturulan bir SearchableInfo nesnesini 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 amacıyla bir etkinlik başlatır. Ardından, bu amaca göre filtreleme yapabilen ve arama sorgusunu işleyebilen bir etkinliğe ihtiyacınız olur.

Aranabilir etkinlik oluşturma

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

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

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