Özel arama önerileri ekleyin

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

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 önerilerinin yer aldığı 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 bilgiler

1.şekil 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.
  • ve uzantısı olan bir içerik sağlayıcı oluşturun ve bunu uygulama manifestinizde bildirin.SearchRecentSuggestionsProvider
  • Arama önerileri sağlayan içerik sağlayıcı hakkında bilgilerle 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:

  1. Sistem, kullanıcının yazmaya başladığı arama sorgusu metnini alır ve önerilerinizi içeren bir sorgu göndererek içerik sağlayıcıya iletir.
  2. İçerik sağlayıcınız, arama sorgusu metniyle eşleşen tüm önerilere işaret eden bir Cursor döndürür.
  3. Sistem, Cursor tarafından sağlanan öneri listesini gösterir.

Son sorgu önerileri gösterildikten sonra aşağıdakiler gerçekleşebilir:

  • 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_SEARCH amaç kullanılarak aranabilir etkinliğinize iletilir.
  • Kullanıcı bir öneri seçerse sorgu olarak önerilen metnin kullanıldığı bir ACTION_SEARCH amaç, 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 çok az kod vardı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 beyan edin. Ö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() çağrısını yapı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 dize 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şir.

Ö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() çağrısını yapı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çiminize göre gerçekleştirin. Kullanıcının arama geçmişini silmek istediğini doğrulamak için onay iletişim kutusu gösterin.