검색 인터페이스 설정

이때 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>
드림 <ph type="x-smartling-placeholder">

보다 접근하기 쉬운 검색 아이콘을 사용하려면 /res/drawable 폴더에 있는 ic_search.xml 파일 및 다음 코드를 포함해야 합니다.

<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 리소스의 <ph type="x-smartling-placeholder">onCreateOptionsMenu()</ph> 사용합니다.

Kotlin

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 속성과 같은 값입니다. <애플리케이션> 또는 <activity> 요소를 정의할 수 있습니다. 하지만 사용자에게 입력할 내용을 알려주는 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() 메서드에서 다음을 호출하여 SearchView로 검색 구성을 설정합니다. setSearchableInfo(SearchableInfo):

Kotlin

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 및 사용자가 쿼리를 제출하면 SearchViewACTION_SEARCH 인텐트를 지정할 수 있습니다. 그런 다음 이 인텐트를 필터링하고 검색 쿼리

검색 가능 활동 만들기

ACTION_SEARCH 인텐트의 검색 가능한 활동 필터 및 데이터 세트에서 검색어를 검색합니다. 검색 가능 활동을 만들려면 ACTION_SEARCH 필터링을 위해 선택한 활동 인텐트:

<activity android:name=".SearchResultsActivity" ... >
    ...
    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    ...
</activity>

검색 활동에서 다음과 같이 ACTION_SEARCH 인텐트를 처리합니다. 다음에서 확인해 보세요. onCreate() 메서드를 사용하여 축소하도록 요청합니다.

<ph type="x-smartling-placeholder">

Kotlin

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)로서 앱의 다른 레이어에서 이를 사용할 수 있습니다. 표시할 검색결과를 가져오는 아키텍처입니다.