이전 버전과의 호환성 유지

SearchView 및 작업 모음은 Android 3.0 이상에서만 사용할 수 있습니다. 이전 플랫폼을 지원하려면 검색 대화상자로 돌아가세요. 검색 대화상자는 시스템에서 제공하는 UI로, 호출 시 애플리케이션 위에 오버레이됩니다.

최소 및 대상 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;
}