Uygulamanızda arama işlevi sağlamak için uygulama çubuğunda SearchView
öğesini kullanmanızı öneririz. Uygulama çubuğundaki tüm öğelerde olduğu gibi, SearchView öğesinin her zaman veya yalnızca yer olduğunda gösterilmesini sağlayabilirsiniz. Ayrıca, başlangıçta simge olarak SearchView simgesini gösteren ve kullanıcı simgeye dokunduğunda arama alanı olarak tüm uygulama çubuğunu kaplayan daraltılabilir bir işlem olarak da tanımlayabilirsiniz.
SearchView'ı uygulama çubuğuna ekleme
Uygulama çubuğuna SearchView widget'ı eklemek için projenizde res/menu/options_menu.xml adlı bir dosya oluşturun ve dosyaya aşağıdaki kodu ekleyin. Bu kod, kullanılacak simge ve öğenin başlığı gibi arama öğesinin nasıl oluşturulacağını tanımlar. collapseActionView özelliği, SearchView öğenizin tüm uygulama çubuğunu kaplayacak şekilde genişlemesini ve kullanılmadığında normal bir uygulama çubuğu öğesine geri daralmasını sağlar. Cep telefonu cihazlarındaki uygulama çubuğu alanı sınırlı olduğundan daha iyi bir kullanıcı deneyimi sunmak için collapsibleActionView özelliğini kullanmanızı öneririz.
<?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 bir ic_search.xml dosyası oluşturun ve aşağıdaki kodu bu dosyaya 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 etkinliğinizin onCreateOptionsMenu() yönteminde XML menü kaynağını res/menu/options_menu.xml genişletin:
Kotlin
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.options_menu, menu) return true }
Uygulamayı çalıştırmak aşağıdaki gibi bir sonuç üretir:
SearchView simgesi, uygulamanızın uygulama çubuğunda görünüyor ancak işlevsel değil. Arama simgesine dokunduğunuzda aşağıdaki gibi bir sonuç görürsünüz:
SearchView kullanım örnekleri.
SearchView öğesinin işlevsel olması için SearchView öğesinin nasıl davranacağını tanımlamanız gerekir.
Arama yapılandırması oluşturma
Arama
yapılandırması, SearchView öğesinin nasıl davranacağını belirtir ve res/xml/searchable.xml dosyasında tanımlanır. Bir arama yapılandırması, Android manifestinizdeki <application> veya <activity> öğesinin android:label özelliğiyle aynı değere sahip olan en az bir android:label özelliği içermelidir. Ancak, kullanıcıya arama kutusuna ne gireceği konusunda fikir vermek için bir android:hint özelliği eklemenizi de öneririz.
<?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 manifesto dosyasında, res/xml/searchable.xml dosyasına işaret eden bir
<meta-data>
öğesi tanımlayın. <activity> öğesini, SearchView öğesini göstermek istediğiniz bir <activity> içinde bildirin.
<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, setSearchableInfo(SearchableInfo)'ı çağırarak arama yapılandırmasını SearchView ile ilişkilendirin:
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 }
getSearchableInfo()
SearchableInfo
çağrısı, arama yapılandırması XML dosyasından oluşturulan bir
SearchableInfo nesnesini alır. Arama yapılandırması SearchView ile doğru şekilde ilişkilendirildiğinde ve kullanıcı bir sorgu gönderdiğinde SearchView, ACTION_SEARCH
amacıyla bir etkinlik başlatır. Ardından, bu amaca göre filtreleme yapabilen ve arama sorgusunu işleyebilen bir etkinliğe ihtiyacınız olur.
Aranabilir etkinlik oluşturma
ACTION_SEARCH amacı için aranabilir etkinlik filtreleri ve bir veri kümesinde sorguyu arar. Aranabilir bir etkinlik oluşturmak için ACTION_SEARCH amacına göre filtrelemek üzere istediğiniz bir etkinliği tanımlayın:
<activity android:name=".SearchResultsActivity" ... > ... <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> ... </activity>
Aranabilir etkinliğinizde, ACTION_SEARCH amacını onCreate() yönteminizde kontrol ederek işleyin.
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 edebilir ve ACTION_SEARCH niyetiyle aranabilir etkinliğinizi başlatabilir.
Arama sorgusunu aldıktan sonra ViewModel iletebilirsiniz. Burada, arama sonuçlarını almak ve görüntülemek için mimarinizin diğer katmanlarında kullanabilirsiniz.