其他后向兼容组件

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

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

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

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

<application>
...

为旧设备提供搜索对话框

如需在旧设备上调用搜索对话框,请在用户选择搜索时调用 onSearchRequested() 从选项菜单中创建菜单项。由于搭载 Android 3.0 及更高版本的设备显示的是 操作栏中的 SearchView(如第一课所示),仅限版本 调用 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;
}