Android arama iletişim kutusunda veya arama widget'ında son arama sorgularına dayalı arama önerileri sağlayabilirsiniz. Örneğin, bir kullanıcı "köpek yavruları" sorgusunu girdiğinde aynı sorguyu tekrar yazdığında bu sorgu öneri olarak gösterilir. Şekil 1'de, son sorgu önerilerini içeren bir arama iletişim kutusu örneği gösterilmektedir.
Başlamadan önce, uygulamanızda temel aramalar için arama iletişim kutusunu veya arama widget'ını uygulayın. Nasıl yapılacağını öğrenmek için Arama arayüzü oluşturma başlıklı makaleyi inceleyin.
Temel özellikler
Şekil 1. Son sorgu önerilerinin yer aldığı bir arama iletişim kutusunun ekran görüntüsü.
Son sorgu önerileri, kaydedilmiş aramalardır. Kullanıcı bir öneri seçtiğinde, aranabilir etkinliğiniz, aranabilir etkinliğinizin zaten işlediği arama sorgusu olarak öneriyle birlikte bir ACTION_SEARCH amacı alır.
Son sorgu önerileri sunmak için:
- Aranabilir bir etkinlik uygulayın.
- Öğesini genişleten bir içerik sağlayıcı oluşturun
SearchRecentSuggestionsProviderve bunu uygulama manifestinizde bildirin. - Arama önerileri sunan içerik sağlayıcı hakkında bilgi içeren aranabilir yapılandırmayı değiştirin.
- Her arama yapıldığında içerik sağlayıcınıza sorgu kaydedin.
Android sistemi, arama iletişim kutusunu gösterdiği gibi arama önerilerini de iletişim kutusunun veya arama widget'ının altında gösterir. Sistemin önerileri aldığı kaynağı siz sağlarsınız.
Sistem, etkinliğinizin aranabilir olduğunu belirleyip arama önerileri sunduğunda kullanıcı bir sorgu yazdığında aşağıdaki durumlar yaşanır:
- Sistem, kullanıcının yazmaya başladığı arama sorgusu metnini alır ve önerilerinizi içeren bir sorguyu içerik sağlayıcıya gönderir.
- İçerik sağlayıcınız, arama sorgusu metniyle eşleşen tüm önerilere işaret eden bir
Cursordöndürür. - Sistem,
Cursortarafından sağlanan öneri listesini gösterir.
Son sorgu önerileri gösterildikten sonra şunlar olabilir:
- Kullanıcı başka bir tuşa basarsa veya sorguyu herhangi bir şekilde değiştirirse önceki adımlar tekrarlanır ve öneri listesi güncellenir.
- Kullanıcı aramayı gerçekleştirirse öneriler yoksayılır ve arama, normal
ACTION_SEARCHamaç kullanılarak aranabilir etkinliğinize iletilir. - Kullanıcı bir öneri seçerse sorgu olarak önerilen metnin kullanıldığı bir
ACTION_SEARCHamaç, aranabilir etkinliğinize iletilir.
İçerik sağlayıcınız için genişlettiğiniz SearchRecentSuggestionsProvider sınıfı
önceki adımlardaki işi otomatik olarak yapar. Bu nedenle, yazılacak kod çok azdır.
İçerik sağlayıcı oluşturma
Son sorgu önerileri için ihtiyacınız olan içerik sağlayıcı, SearchRecentSuggestionsProvider'nın bir uygulamasıdır. Bu sınıf sizin için her şeyi yapar. Tek bir kod satırı yürüten bir sınıf oluşturucu yazmanız yeterlidir.
Örneğin, son sorgu önerileri için içerik sağlayıcının tam bir uygulamasını aşağıda bulabilirsiniz:
Kotlin
class MySuggestionProvider : SearchRecentSuggestionsProvider() { init { setupSuggestions(AUTHORITY, MODE) } companion object { const val AUTHORITY = "com.example.MySuggestionProvider" const val MODE: Int = SearchRecentSuggestionsProvider.DATABASE_MODE_QUERIES } }
Java
public class MySuggestionProvider extends SearchRecentSuggestionsProvider { public final static String AUTHORITY = "com.example.MySuggestionProvider"; public final static int MODE = DATABASE_MODE_QUERIES; public MySuggestionProvider() { setupSuggestions(AUTHORITY, MODE); } }
setupSuggestions() çağrısı, arama yetkilisinin adını ve bir veritabanı modunu iletir. Arama yetkilisi herhangi bir benzersiz dize olabilir ancak en iyi uygulama, içerik sağlayıcınız için tam nitelikli bir ad kullanmaktır. Örneğin, paket adından sonra sağlayıcının sınıf adı gelir. Örneğin,
"com.example.MySuggestionProvider".
Veritabanı modu şunları içermelidir:
DATABASE_MODE_QUERIES
İsteğe bağlı olarak şunları içerebilir:
DATABASE_MODE_2LINES. Bu, öneri tablosuna bir sütun ekleyerek her öneriyle birlikte ikinci bir metin satırı sağlamanıza olanak tanır. Her öneride iki satır sağlamak istiyorsanız aşağıdaki örneğe bakın:
Kotlin
const val MODE: Int = DATABASE_MODE_QUERIES or DATABASE_MODE_2LINES
Java
public final static int MODE = DATABASE_MODE_QUERIES | DATABASE_MODE_2LINES;
İçerik sağlayıcıyı, uygulama manifestinizde SearchRecentSuggestionsProvider sınıfınızda ve aranabilir yapılandırmada kullanılan yetki dizesiyle aynı şekilde tanımlayın. Örneğin:
<application> <provider android:name=".MySuggestionProvider" android:authorities="com.example.MySuggestionProvider" /> ... </application>
Aranabilir yapılandırmayı değiştirme
Sistemi öneri sağlayıcınızı kullanacak şekilde yapılandırmak için aranabilir yapılandırma dosyanızdaki <searchable> öğesine android:searchSuggestAuthority ve android:searchSuggestSelection özelliklerini ekleyin. Örneğin:
<?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/app_label" android:hint="@string/search_hint" android:searchSuggestAuthority="com.example.MySuggestionProvider" android:searchSuggestSelection=" ?" > </searchable>
android:searchSuggestAuthority değeri, içerik sağlayıcınızın tam nitelikli adı olmalı ve içerik sağlayıcıda kullanılan yetkiliyle tam olarak eşleşmelidir. Örneğin, önceki örneklerdeki "com.example.MySuggestionProvider".
android:searchSuggestSelection değeri, başında boşluk olan tek bir soru işareti olmalıdır: " ?". Bu, SQLite seçim bağımsız değişkeni için bir yer tutucudur ve kullanıcı tarafından girilen sorgu metniyle otomatik olarak değiştirilir.
Sorguları kaydetme
Son sorgular koleksiyonunuzu doldurmak için aranabilir etkinliğiniz tarafından alınan her sorguyu SearchRecentSuggestionsProvider bölümüne ekleyin. Bunu yapmak için
SearchRecentSuggestions örneğini oluşturun ve aranabilir etkinliğiniz her sorgu aldığında
saveRecentQuery() işlevini çağırın. Örneğin, etkinliğinizin onCreate() yönteminde sorguyu şu şekilde kaydedebilirsiniz:
Kotlin
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.main) if (Intent.ACTION_SEARCH == intent.action) { intent.getStringExtra(SearchManager.QUERY)?.also { query -> SearchRecentSuggestions(this, MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE) .saveRecentQuery(query, null) } } }
Java
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Intent intent = getIntent(); if (Intent.ACTION_SEARCH.equals(intent.getAction())) { String query = intent.getStringExtra(SearchManager.QUERY); SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, MySuggestionProvider.AUTHORITY, MySuggestionProvider.MODE); suggestions.saveRecentQuery(query, null); } }
SearchRecentSuggestionsProvider oluşturucusu, içerik sağlayıcınız tarafından bildirilen yetki ve veritabanı modunun aynı olmasını gerektirir.
saveRecentQuery() yöntemi, arama sorgusu dizesini ilk parametre olarak, isteğe bağlı olarak da önerinin ikinci satırı olarak eklenecek ikinci bir dizeyi veya null değerini alır. İkinci parametre yalnızca DATABASE_MODE_2LINES ile arama önerileri için iki satırlık modu etkinleştirirseniz kullanılır. İki satırlı modu etkinleştirirseniz sistem eşleşen öneriler ararken sorgu metni ikinci satırla eşleştirilir.
Öneri verilerini temizleme
Kullanıcı gizliliğini korumak için kullanıcının son sorgu önerilerini temizlemesine her zaman olanak tanıyın. Sorgu geçmişini temizlemek için clearHistory() işlevini çağırın.
Örneğin:
Kotlin
SearchRecentSuggestions(this, HelloSuggestionsProvider.AUTHORITY, HelloSuggestionsProvider.MODE) .clearHistory()
Java
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE); suggestions.clearHistory();
Bu işlemi, "Arama Geçmişini Temizle" menü öğesi, tercih öğesi veya düğmesi seçerek yapabilirsiniz. Kullanıcının arama geçmişini silmek istediğini doğrulamak için onay iletişim kutusu gösterin.