Uygulamanızda arama işlevselliği sağlamak için SearchView
widget'ını uygulama çubuğunda bir öğe olarak kullanmanızı öneririz. Uygulama çubuğundaki tüm öğelerde olduğu gibi, SearchView
öğesini her zaman veya yalnızca yer olduğunda gösterilecek şekilde tanımlayabilirsiniz. Bunu, başlangıçta SearchView
simgesini simge olarak gösteren ve daha sonra kullanıcı simgeye dokunduğunda uygulama çubuğunun tamamını arama alanı olarak kaplayan daraltılabilir işlem olarak da tanımlayabilirsiniz.
SearchView'u uygulama çubuğuna ekleyin
Uygulama çubuğuna SearchView
widget'ı eklemek için projenizde res/menu/options_menu.xml
adlı bir dosya oluşturun ve aşağıdaki kodu dosyaya 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 kullanılmadığında tüm uygulama çubuğunu kaplayacak ve tekrar normal bir uygulama çubuğu öğesine dönüşecek şekilde genişlemesini sağlar. Mobil cihazlarda uygulama çubuğu sınırlı olduğundan, daha iyi bir kullanıcı deneyimi sağlamak 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
simgesini görüntülemek için etkinliğinizin onCreateOptionsMenu()
yöntemindeki XML menü kaynağını res/menu/options_menu.xml
şişirin:
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şur:
SearchView
, uygulamanızın uygulama çubuğunda görünür ancak çalışmaz. Arama simgesine dokunursanız şuna benzer bir şey görürsünüz:
SearchView
öğesini işlevsel hale getirmek için SearchView
özelliğinin nasıl davrandığını tanımlamanız gerekir.
Arama yapılandırması oluşturma
Arama yapılandırması, SearchView
işlevinin nasıl davranacağını belirtir ve bir res/xml/searchable.xml
dosyasında tanımlanır. Bir arama yapılandırması en az, Android manifestinizdeki <application> veya <activity> öğesinin android:label
özelliğiyle aynı değere sahip bir android:label
özelliği içermelidir. Ancak, kullanıcıya arama kutusuna ne gireceği konusunda fikir vermek için android:hint
özelliği de eklemenizi ö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 manifest dosyasında, res/xml/searchable.xml
dosyasına işaret eden bir <meta-data>
öğesi tanımlayın. SearchView
içinde görüntülemek istediğiniz öğeyi <activity>
içinde tanımlayın.
<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)
yöntemini ç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()
çağrısı, arama yapılandırması XML dosyasından oluşturulan bir SearchableInfo
nesnesi elde eder. Arama yapılandırması SearchView
ile doğru şekilde ilişkilendirildiğinde ve kullanıcı bir sorgu gönderdiğinde SearchView
, ACTION_SEARCH
amacına sahip bir etkinlik başlatır. Ardından, bu niyet için filtreleyebilecek ve arama sorgusunu işleyebilen bir etkinlik gerekir.
Aranabilir bir etkinlik oluşturma
ACTION_SEARCH
amacı için aranabilir etkinlik filtreleridir ve sorguyu bir veri kümesinde arar. Aranabilir bir etkinlik oluşturmak için ACTION_SEARCH
amacına göre filtrelemek üzere istediğiniz bir etkinliği beyan edin:
<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 yönetin.
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
amacıyla aranabilir etkinliğinizi başlatabilir.
Arama sorgusunu aldıktan sonra, bu sorguyu ViewModel
'a iletebilirsiniz. Burada, görüntülenecek arama sonuçlarını almak için bu sorguyu mimarinizin diğer katmanlarında kullanabilirsiniz.