Özel arama önerileri ekleyin

Android arama iletişim kutusunda son arama sorgularına dayalı arama önerileri sağlayabilirsiniz. Arama widget'ı. Örneğin, bir kullanıcı "yavru köpekler" sorgu öneri olarak görünür. aynı sorguyu tekrar yazın. Şekil 1'de son sorguyu içeren bir arama iletişim kutusu örneği gösterilmektedir öneriler.

Başlamadan önce temel aramalar için arama iletişim kutusunu veya bir arama widget'ı uygulayın tercih edebilirsiniz. Bunu nasıl yapacağınızı öğrenmek için bkz. Arama arayüzü oluşturun.

Temel bilgiler

Şekil 1. Son sorgunun yer aldığı arama iletişim kutusunun ekran görüntüsü öneriler.

Son sorgu önerileri kayıtlı aramalardır. Kullanıcı bir öneri seçtiğinde, arama yapılabilir etkinlik ACTION_SEARCH intent bunu aranabilir etkinliğinizin halihazırda işlediği arama sorgusu olarak ayarlar.

Son sorgularla ilgili öneriler sağlamak için şunları yapmanız gerekir:

  • Aranabilir bir etkinlik uygulayın.
  • Bir içerik sağlayıcı oluşturarak SearchRecentSuggestionsProvider. uygulama manifestinizde bunu beyan edin.
  • Aranabilir yapılandırmayı, sağlayan içerik sağlayıcısı hakkındaki bilgilerle değiştirin arama önerileri.
  • Her arama yürütüldüğünde sorguları içerik sağlayıcınıza kaydedin.

Android sisteminin arama iletişim kutusunu görüntülediği gibi aşağıda arama önerileri de gösterilir iletişim kutusu veya arama widget'ı. Sistemin önerileri aldığı kaynağı siz sağlarsınız.

Sistem, etkinliğinizin aranabilir olduğunu saptadığında ve arama önerileri sunduğunda kullanıcı bir sorgu yazdığında şunlar olur:

  1. Sistem, kullanıcının yazmaya başladığı şey ne olursa olsun arama sorgusu metnini alır ve İçerik sağlayıcıya önerilerinizi içeren bir sorgu gerçekleştirir.
  2. İçerik sağlayıcınız şunu döndürür: Tümünü işaret eden Cursor Arama sorgusu metniyle eşleşen öneriler sunar.
  3. Sistem, Cursor tarafından sağlanan önerilerin listesini görüntüler.

Son sorgu önerileri görüntülendikten sonra, aşağıdakiler gerçekleşebilir:

  • Kullanıcı başka bir anahtar girerse veya sorguyu herhangi bir şekilde değiştirirse önceki adımlar şunlardır: güncellenir ve öneri listesi güncellenir.
  • Kullanıcı aramayı yürütürse öneriler yoksayılır ve arama, normal ACTION_SEARCH niyetini kullanarak aranabilir etkinliğiniz.
  • Kullanıcı bir öneri seçerse hesabınıza ACTION_SEARCH niyeti iletilir sorgu olarak önerilen metni kullanarak arama yapılabilir etkinlik oluşturabilirsiniz.

İçerik sağlayıcınız için genişlettiğiniz SearchRecentSuggestionsProvider sınıfı önceki adımlarda açıklanan işlemleri otomatik olarak yaptığından, yazılacak çok az kod olur.

İçerik sağlayıcı oluşturun

Son sorgu önerileri için ihtiyacınız olan içerik sağlayıcı, SearchRecentSuggestionsProvider Bu sınıf sizin için her şeyi yapıyor. Yapmanız gerekenler bir kod satırı yürüten sınıf kurucusu yazın.

Örneğin, burada son sorgu için bir içerik sağlayıcının eksiksiz uygulamasını öneriler:

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);
    }
}

Hedef setupSuggestions(). arama yetkilisinin adını ve bir veritabanı modu iletir. Arama yetkilisi dizesidir, ancak en iyi uygulama içerik sağlayıcınız için tam olarak uygun bir ad kullanmaktır: paket adı ve ardından sağlayıcının sınıf adı. Örneğin, "com.example.MySuggestionProvider"

Veritabanı modu DATABASE_MODE_QUERIES. ve isteğe bağlı olarak DATABASE_MODE_2LINES, Bu, öneriler tablosuna, her bir sütun için ikinci bir metin satırı sağlayabilmeniz için bir sütun ekler öneririz. 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;

Uygulama manifestinizdeki içerik sağlayıcıyı, SearchRecentSuggestionsProvider sınıfınızda ve aranabilir yapılandırmada kullanın. Örneğin, örnek:

<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 android:searchSuggestAuthority android:searchSuggestSelection özellikleri, aranabilir yapılandırma dosyanızdaki <searchable> öğesine eklenir. Örneğin, örnek:

<?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ıda kullanılan yetkili kurumla tam olarak eşleşen bir içerik sağlayıcı, örneğin "com.example.MySuggestionProvider" olarak tanımlanmıştır.

android:searchSuggestSelection değerinin önünde tek bir soru işareti olmalıdır bir alan tarafından: " ?". Bu, SQLite seçimi bağımsız değişkeni için bir yer tutucudur ve kullanıcının girdiği sorgu metniyle otomatik olarak değiştirilir.

Sorguları kaydet

Son sorgulardan oluşan koleksiyonunuzu doldurmak için, arama yapılabilir etkinliğiniz SearchRecentSuggestionsProvider cihazınızda. Bunu yapmak için SearchRecentSuggestions. arayın saveRecentQuery() her sorgu yapıldığında kullanılabilir. Örneğin, sorguyu nasıl kaydedebileceğiniz aşağıda aktiviteleri sırasında onCreate(). yöntem:

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, tarafından beyan edilen yetki ve veritabanı modunun aynısı.

saveRecentQuery() yöntemi, arama sorgusu dizesini ilk parametre olarak alır ve isteğe bağlı olarak önerinin ikinci satırı veya boş değer olarak eklenecek ikinci bir dize. İkinci parametresi yalnızca DATABASE_MODE_2LINES İki satırlı modu etkinleştirirseniz sorgu metni ikinci satıra yönlendirilirsiniz.

Öneri verilerini temizle

Kullanıcının gizliliğini korumak amacıyla her zaman kullanıcının son sorguyu temizlemesi için bir yöntem sağlayın öneriler. Sorgu geçmişini temizlemek için şu numarayı arayın: clearHistory() Örnek:

Kotlin

SearchRecentSuggestions(this, HelloSuggestionsProvider.AUTHORITY, HelloSuggestionsProvider.MODE)
        .clearHistory()

Java

SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this,
        HelloSuggestionProvider.AUTHORITY, HelloSuggestionProvider.MODE);
suggestions.clearHistory();

Bu işlemi, seçtiğiniz "Arama Geçmişini Temizle" seçeneğiyle yürütün menü öğesini, tercih öğesini veya düğmeyi tıklayın. Kullanıcının arama geçmişini silmek istediğini doğrulamak için bir onay iletişim kutusu sağlayın.