Android arama iletişim kutusunda veya arama widget'ında bulunan son arama sorgularına dayalı arama önerileri sağlayabilirsiniz. Örneğin, bir kullanıcı "yavru köpekler" için arama yaparsa bu sorgu, kullanıcı aynı sorguyu tekrar yazdığında öneri olarak görünür. Şekil 1'de, son sorgu önerilerinin bulunduğu bir arama iletişim kutusu örneği gösterilmektedir.
Başlamadan önce, uygulamanızdaki temel aramalar için arama iletişim kutusunu veya bir arama widget'ını uygulayın. Nasıl yapılacağını öğrenmek için Arama arayüzü oluşturma bölümüne bakın.
Temel bilgiler
Son sorgu önerileri kayıtlı aramalardır. Kullanıcı bir öneriyi seçtiğinde, aranabilir etkinliğiniz zaten işlediği arama sorgusu ile birlikte öneriyle birlikte bir ACTION_SEARCH
amacı alır.
Son sorgularla ilgili öneriler sağlamak için şunları yapmanız gerekir:
- Aranabilir bir etkinlik uygulamaya sokun.
SearchRecentSuggestionsProvider
öğesini genişleten bir içerik sağlayıcı oluşturun ve bunu uygulama manifestinizde beyan edin.- Aranabilir yapılandırmayı, arama önerileri sağlayan içerik sağlayıcı hakkındaki bilgilerle değiştirin.
- Her arama yapıldığında sorguları içerik sağlayıcınıza kaydedin.
Android sisteminin arama iletişim kutusunu görüntülemesi gibi, iletişim kutusunun veya arama widget'ının altında arama önerileri de görüntülenir. Sistemin önerileri aldığı kaynağı belirtirsiniz.
Sistem, etkinliğinizin aranabilir olduğunu belirlediğinde ve arama önerileri sağladığında kullanıcı bir sorgu yazdığında aşağıdakiler gerçekleşir:
- Sistem, arama sorgusu metnini (kullanıcının yazmaya başladığı neyse) alır ve önerilerinizi içeren içerik sağlayıcıya bir sorgu gerçekleştirir.
- İçerik sağlayıcınız, arama sorgusu metniyle eşleşen tüm önerileri işaret eden bir
Cursor
döndürür. - Sistem,
Cursor
tarafından sağlanan önerilerin listesini görüntüler.
Son sorgu önerileri gösterildiğinde aşağıdakiler gerçekleşebilir:
- Kullanıcı başka bir anahtar yazar veya sorguyu herhangi bir şekilde değiştirirse önceki adımlar tekrarlanır ve öneri listesi güncellenir.
- Kullanıcı aramayı yaparsa öneriler yoksayılır ve arama, normal
ACTION_SEARCH
amacı kullanılarak aranabilir etkinliğinize iletilir. - Kullanıcı bir öneriyi seçerse önerilen metin sorgu olarak kullanılarak aranabilir etkinliğinize
ACTION_SEARCH
amacı gönderilir.
İçerik sağlayıcınız için genişlettiğiniz SearchRecentSuggestionsProvider
sınıfı önceki adımlardaki işi otomatik olarak yaptığından yazılacak çok az kod olur.
İçerik sağlayıcı oluşturma
Son sorgu önerileri için ihtiyacınız olan içerik sağlayıcı, SearchRecentSuggestionsProvider
uygulamasının bir uygulamasıdır. Bu sınıf sizin için her şeyi yapar. Tek satır kod 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 eksiksiz bir uygulamasını burada görebilirsiniz:
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 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 (ör. paket adı ve sağlayıcının sınıf adı) kullanmaktır. Örneğin,
"com.example.MySuggestionProvider"
.
Veritabanı modu DATABASE_MODE_QUERIES
içermelidir ve isteğe bağlı olarak DATABASE_MODE_2LINES
içerebilir. Bu, öneriler tablosuna bir sütun ekler. Böylece her öneriyle ikinci bir metin satırı sağlayabilirsiniz. Her öneride iki satır eklemek 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;
Uygulama manifestinizde içerik sağlayıcıyı SearchRecentSuggestionsProvider
sınıfınızda ve aranabilir yapılandırmada kullanılan yetkili dizesiyle 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 için önceki örneklerdeki "com.example.MySuggestionProvider"
gibi, içerik sağlayıcıda kullanılan yetkiliyle tam olarak eşleşen tam nitelikli bir ad olmalıdır.
android:searchSuggestSelection
değerinin önünde boşluk bulunan tek bir soru işareti olmalıdır: " ?"
. Bu, SQLite seçim bağımsız değişkeni için bir yer tutucudur ve otomatik olarak kullanıcı tarafından girilen sorgu metniyle değiştirilir.
Sorguları kaydet
Son sorgular koleksiyonunuzu doldurmak için, aranabilir etkinliğiniz tarafından alınan her bir sorguyu SearchRecentSuggestionsProvider
cihazınıza ekleyin. Bunu yapmak için SearchRecentSuggestions
örneği oluşturun ve aranabilir etkinliğiniz her sorgu aldığında saveRecentQuery()
çağrısı yapın. Örneğin, etkinliğinizin onCreate()
yöntemi sırasında 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şturucu, içerik sağlayıcınız tarafından tanımlanan aynı yetkiliyi ve veritabanı modunu gerektirir.
saveRecentQuery()
yöntemi, arama sorgusu dizesini ilk parametre olarak alır ve isteğe bağlı olarak ikinci bir dizeyi önerinin veya null değerinin ikinci satırı olarak ekler. İkinci parametre yalnızca DATABASE_MODE_2LINES
ile arama önerileri için iki satırlı modu etkinleştirirseniz kullanılır. İki satırlı modu etkinleştirirseniz sistem eşleşen öneriler aradığında sorgu metni ikinci satırla eşleşir.
Öneri verilerini temizle
Kullanıcının gizliliğini korumak için her zaman kullanıcıya son sorgu önerilerini temizlemesi için bir yol sağlayın. Sorgu geçmişini temizlemek için
clearHistory()
çağrısı yapın.
Örneğin:
Kotlin
SearchRecentSuggestions(this, HelloSuggestionsProvider.AUTHORITY, HelloSuggestionsProvider.MODE) .clearHistory()
Java
SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE); suggestions.clearHistory();
Bunu, "Arama Geçmişini Temizle" menü öğesi, tercih öğesi veya düğme seçiminizden yürütün. Kullanıcının arama geçmişini silmek istediğini doğrulamak için bir onay iletişim kutusu sağlayın.