Özel arama önerileri ekleyin

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

Şekil 1. Son sorgu önerilerini içeren bir arama iletişim kutusunun ekran görüntüsü.

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:

  1. 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.
  2. İçerik sağlayıcınız, arama sorgusu metniyle eşleşen tüm önerileri işaret eden bir Cursor döndürür.
  3. 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.