رابط جستجو را تنظیم کنید

توصیه می کنیم از ویجت 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
}

اجرای برنامه چیزی شبیه به این تولید می کند:

تصویری که صفحه خالی را با نماد جستجو در نوار بالای برنامه نشان می دهد
شکل 1. یک نماد جستجو در نوار بالای برنامه.

SearchView در نوار برنامه برنامه شما ظاهر می شود، اما کاربردی نیست. اگر روی نماد جستجو ضربه بزنید، چیزی شبیه به این دریافت خواهید کرد:

تصویری که نمای جستجو را در عمل نشان می دهد
شکل 2. 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 ارسال کنید، جایی که می توانید از آن در لایه های دیگر معماری خود برای بازیابی نتایج جستجو برای نمایش استفاده کنید.