توصیه می کنیم از ویجت SearchView
به عنوان یک مورد در نوار برنامه برای ارائه قابلیت جستجو در برنامه خود استفاده کنید. مانند همه موارد موجود در نوار برنامه، میتوانید SearchView
طوری تعریف کنید که همیشه یا فقط زمانی که جا وجود دارد نشان داده شود. همچنین میتوانید آن را بهعنوان یک عمل جمعشونده تعریف کنید، که SearchView
را در ابتدا بهعنوان یک نماد نمایش میدهد و وقتی کاربر روی نماد ضربه میزند، کل نوار برنامه را به عنوان یک فیلد جستجو میگیرد.
SearchView را به نوار برنامه اضافه کنید
برای افزودن ویجت SearchView
به نوار برنامه، یک فایل در پروژه خود با نام res/menu/options_menu.xml
ایجاد کنید و کد زیر را به فایل اضافه کنید. این کد نحوه ایجاد آیتم جستجو را مشخص می کند، مانند نماد مورد استفاده و عنوان مورد. ویژگی collapseActionView
به SearchView
شما اجازه میدهد تا کل نوار برنامه را اشغال کند و در زمانی که از آن استفاده نمیکنید، دوباره به یک آیتم نوار برنامه معمولی جمع شود. به دلیل محدودیت فضای نوار برنامه در دستگاههای گوشی، توصیه میکنیم از ویژگی collapsibleActionView
برای ارائه تجربه کاربری بهتر استفاده کنید.
<?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>
اگر میخواهید نماد جستجو در دسترستری داشته باشید، یک فایل ic_search.xml
در پوشه /res/drawable
ایجاد کنید و کد زیر را در آن قرار دهید:
<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>
برای نمایش SearchView
در نوار برنامه، منبع منوی XML res/menu/options_menu.xml
را در متد onCreateOptionsMenu()
فعالیت خود باد کنید:
کاتلین
override fun onCreateOptionsMenu(menu: Menu): Boolean { menuInflater.inflate(R.menu.options_menu, menu) return true }
اجرای برنامه چیزی شبیه به این تولید می کند:
SearchView
در نوار برنامه برنامه شما ظاهر می شود، اما کاربردی نیست. اگر روی نماد جستجو ضربه بزنید، چیزی شبیه به این دریافت خواهید کرد:
برای کاربردی کردن SearchView
، باید نحوه رفتار SearchView
را مشخص کنید.
یک پیکربندی جستجو ایجاد کنید
یک پیکربندی جستجو نحوه رفتار SearchView
را مشخص میکند و در یک فایل res/xml/searchable.xml
تعریف میشود. یک پیکربندی جستجو باید حداقل دارای یک ویژگی android:label
باشد که دارای همان مقدار ویژگی android:label
عنصر <application> یا <activity> در مانیفست Android شما باشد. با این حال، ما همچنین اضافه کردن یک ویژگی android:hint
را توصیه می کنیم تا به کاربر ایده دهد که چه چیزی را در کادر جستجو وارد کند.
<?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" />
در فایل مانیفست برنامه خود، عنصر <meta-data>
را که به فایل res/xml/searchable.xml
اشاره می کند، اعلام کنید. عنصری را در <activity>
که میخواهید 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>
در متد onCreateOptionsMenu()
که ایجاد می کنید، با فراخوانی setSearchableInfo(SearchableInfo)
پیکربندی جستجو را با SearchView
مرتبط کنید:
کاتلین
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
را دریافت می کند که از فایل XML پیکربندی جستجو ایجاد می شود. وقتی پیکربندی جستجو به درستی با SearchView
شما مرتبط شود و کاربر درخواستی را ارسال کند، SearchView
فعالیتی را با هدف ACTION_SEARCH
شروع میکند. سپس به فعالیتی نیاز دارید که بتواند این هدف را فیلتر کند و پرس و جوی جستجو را مدیریت کند.
یک فعالیت قابل جستجو ایجاد کنید
یک فعالیت قابل جستجو برای هدف ACTION_SEARCH
فیلتر میکند و عبارت را در یک مجموعه داده جستجو میکند. برای ایجاد یک فعالیت قابل جستجو، فعالیت مورد نظر خود را برای فیلتر کردن هدف ACTION_SEARCH
اعلام کنید:
<activity android:name=".SearchResultsActivity" ... > ... <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> ... </activity>
در فعالیت قابل جستجوی خود، هدف ACTION_SEARCH
را با بررسی آن در روش onCreate()
مدیریت کنید.
کاتلین
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") } } }
اکنون، SearchView
میتواند درخواست کاربر را بپذیرد و فعالیت قابل جستجوی شما را با هدف ACTION_SEARCH
شروع کند.
پس از به دست آوردن عبارت جستجو، می توانید آن را به ViewModel
ارسال کنید، جایی که می توانید از آن در لایه های دیگر معماری خود برای بازیابی نتایج جستجو برای نمایش استفاده کنید.