其他后向兼容组件

SearchView 和操作栏仅适用于 Android 3.0 及更高版本。要支持旧平台,您可以回退到搜索对话框。搜索对话框是系统提供的界面,会在调用时叠加到应用上方。

设置最低 API 级别和目标 API 级别

要设置搜索对话框,请先在清单中声明您要支持旧设备,但希望以 Android 3.0 或更高版本为目标平台。执行此操作后,您的应用会自动在 Android 3.0 或更高版本上使用操作栏,并在旧设备上使用传统菜单系统:

    <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="15" />

    <application>
    ...
    

为旧设备提供搜索对话框

要在旧设备上调用搜索对话框,只要用户从选项菜单中选择搜索菜单项,就一律调用 onSearchRequested()。由于 Android 3.0 及更高版本的设备会在操作栏中显示 SearchView(如第一课中所示),因此,当用户选择搜索菜单项时,只有早于 3.0 的版本会调用 onOptionsItemSelected()

Kotlin

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.search -> {
                onSearchRequested()
                true
            }
            else -> false
        }
    }
    

Java

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case R.id.search:
                onSearchRequested();
                return true;
            default:
                return false;
        }
    }
    

在运行时检查 Android 版本号

在运行时,检查设备版本以确保在旧设备上不会出现不支持使用 SearchView 的情况。如示例代码所示,这种情况出现在 onCreateOptionsMenu() 方法中:

Kotlin

    override fun onCreateOptionsMenu(menu: Menu): Boolean {

        menuInflater.inflate(R.menu.options_menu, menu)

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
            (menu.findItem(R.id.search).actionView as SearchView).apply {
                setSearchableInfo(searchManager.getSearchableInfo(componentName))
                setIconifiedByDefault(false)
            }
        }
        return true
    }
    

Java

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.options_menu, menu);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            SearchManager searchManager =
                    (SearchManager) getSystemService(Context.SEARCH_SERVICE);
            SearchView searchView =
                    (SearchView) menu.findItem(R.id.search).getActionView();
            searchView.setSearchableInfo(
                    searchManager.getSearchableInfo(getComponentName()));
            searchView.setIconifiedByDefault(false);
        }
        return true;
    }