Arama arayüzünü ayarlama

Şunu kullanmanızı öneririz: SearchView. widget'ını uygulama çubuğunda bir öğe olarak kullanarak uygulamanızda arama işlevi sunabilirsiniz. Farklı uygulama çubuğundaki tüm öğelerle birlikte SearchView öğesini her zaman veya yalnızca yer olduğunda gösterilebilir. Aynı zamanda bunu SearchView öğesini simge olarak gösteren daraltılabilir işlem bir arama alanı olarak kaplar ve ardından, kullanıcı yeniden simgeye dokunur.

Uygulama çubuğuna SearchView'u ekleme

Uygulama çubuğuna bir SearchView widget'ı eklemek için res/menu/options_menu.xml adlı projeye gidip aşağıdaki kodu ekleyin dosyaya ekleyebilirsiniz. Bu kod, arama öğesinin nasıl oluşturulacağını tanımlar (örneğin, başlık ekleyin. collapseActionView özelliği SearchView genişleyerek uygulama çubuğunun tamamını kaplar ve kullanımda olmadığında tekrar normal bir uygulama çubuğu öğesine daralır. RACI matrisinde sınırlı uygulama çubuğu varsa Daha iyi bir kullanıcı sunmak için collapsibleActionView özelliği sahip olacaksınız.

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
        android:title="@string/search_title"
        android:icon="@drawable/ic_search"
        android:showAsAction="collapseActionView|ifRoom"
        android:actionViewClass="androidx.appcompat.widget.SearchView" />
</menu>

Daha erişilebilir bir arama simgesi istiyorsanız /res/drawable klasöründe ic_search.xml dosya ve şu kodu ekleyin:

<vector
    android:height="24dp"
    android:tint="#000000"
    android:viewportHeight="24"
    android:viewportWidth="24"
    android:width="24dp"
    xmlns:android="http://schemas.android.com/apk/res/android">
        <path android:fillColor="@android:color/white" android:pathData="M15.5,14h-0.79l-0.28,-0.27C15.41,12.59 16,11.11 16,9.5 16,5.91 13.09,3 9.5,3S3,5.91 3,9.5 5.91,16 9.5,16c1.61,0 3.09,-0.59 4.23,-1.57l0.27,0.28v0.79l5,4.99L20.49,19l-4.99,-5zM9.5,14C7.01,14 5,11.99 5,9.5S7.01,5 9.5,5 14,7.01 14,9.5 11.99,14 9.5,14z"/>
</vector>

Uygulama çubuğunda SearchView öğesini görüntülemek için XML menüsünü şişirin res/menu/options_menu.xml kaynağının onCreateOptionsMenu() yöntemini seçin:

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    return true
}

Uygulamayı çalıştırdığınızda şöyle bir şey oluşturulur:

Uygulamanın üst çubuğunda arama simgesi bulunan boş bir ekranı gösteren resim
Şekil 1. Uygulamanın üst çubuğunda bir arama simgesi.

SearchView, uygulamanızın uygulama çubuğunda görünür ancak görünmüyor çalışır. Arama simgesine dokunursanız şuna benzer bir şey görürsünüz:

Arama görünümünü iş başında gösteren resim
Şekil 2. SearchView iş başında.

SearchView öğesini işlevsel hale getirmek için SearchView davranıyor.

Arama yapılandırması oluşturma

Arama yapılandırması, SearchView kodunun nasıl davrandığını belirtir res/xml/searchable.xml dosyasında tanımlanmıştır. Arama yapılandırması en azından aşağıdaki özelliklere sahip bir android:label özelliği içermelidir: özelliğinin android:label özelliğiyle aynı <uygulama> veya <activity> öğesini eklemeniz gerekir. Bununla birlikte, Kullanıcıya ne gireceği hakkında fikir vermek için android:hint özelliği yazarsınız.

<?xml version="1.0" encoding="utf-8"?>

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
        android:label="@string/app_name"
        android:hint="@string/search_hint" />

Uygulamanızın manifest dosyasında <meta-data> öğesi (res/xml/searchable.xml dosyasına işaret eden) içerir. Tanımlayın öğesini görüntülemek istediğiniz bir <activity> içinde SearchView.

<activity
android:name=".SearchResultsActivity"
android:exported="false"
android:label="@string/title_activity_search_results"
android:launchMode="singleTop"
android:theme="@style/Theme.AppCompat.Light">
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data
        android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>

Oluşturduğunuz onCreateOptionsMenu() yönteminde, şunu çağırarak SearchView ile arama yapılandırmasını setSearchableInfo(SearchableInfo):

Kotlin

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.options_menu, menu)

    val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
    val searchView = menu.findItem(R.id.search).actionView as SearchView
    val component = ComponentName(this, SearchResultsActivity::class.java)
    val searchableInfo = searchManager.getSearchableInfo(component)
    searchView.setSearchableInfo(searchableInfo)
    return true
}

Hedef getSearchableInfo(). sahip olur SearchableInfo nesnesini ifade eder. Arama yapılandırması SearchView ve kullanıcı bir sorgu gönderdiğinde SearchView, ACTION_SEARCH isteyebilirsiniz. Ardından, bu amaca yönelik filtre uygulayacak ve anlamına gelir.

Aranabilir etkinlik oluşturun

ACTION_SEARCH amacı ve Sorgu bir veri kümesinde arama yapar. Aranabilir etkinlik oluşturmak için şunu beyan edin: ACTION_SEARCH için filtrelemek istediğiniz bir etkinlik amaç:

<activity android:name=".SearchResultsActivity" ... >
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    ...
</activity>

Aranabilir etkinliğinizde ACTION_SEARCH amacını şu şekilde ele alın: program yönetiminde onCreate() yöntemidir.

Kotlin

class SearchResultsActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_search_results)
        handleIntent(intent)
    }

    override fun onNewIntent(intent: Intent) {
        super.onNewIntent(intent)
        handleIntent(intent)
    }

    private fun handleIntent(intent: Intent) {
        if (Intent.ACTION_SEARCH == intent.action) {
            val query = intent.getStringExtra(SearchManager.QUERY)
            Log.d("SEARCH", "Search query was: $query")
        }
    }
}

Artık SearchView, kullanıcının sorgusunu kabul ederek ACTION_SEARCH amacıyla aranabilir etkinlik.

Arama sorgusunu aldıktan sonra, ViewModel katmanını kullanarak diğer katmanlarda kullanabilirsiniz. hangi mimariyi geliştireceğinizi öğrenmeniz gerekir.