액션 뷰 이용
액션 뷰는 액션바에서 특별한 기능을 제공하며 대표적으로 androidx.appcompat.widget.SearchView가 있습니다. 서치 뷰는 액션바에서 검색 기능을 제공합니다.
<item android:id="@+id/menu_search"
android:title="search"
app:ShowAsAction="always"
app:actionViewclass="androidx.appcompat.widget.SearchView" />
액션 뷰를 메뉴에 적용할 때는 actionViewClass 속성을 이용합니다. 이 속성에 이용할 액션 뷰 클래스를 등록하면 됩니다. 이렇게 등록하는 것만으로도 액션바에 검색 버튼이 생기고 버튼을 클릭하면 검색어를 입력받는 뷰가 나옵니다.
코드에서 검색과 관련된 기능을 구현하려면 SearchView 객체를 얻어야 합니다. 서치 뷰가 메 뉴로 제공되므로 SearchView를 등록한 MenuItem 객체를 얻고 MenuItem 객체에 등록된 SearchView 객체를 구하면 됩니다.
override fun onCreateOptionsMenu(menu: Menu): Boolean {
val inflater = menuInflater inflater.inflate(R.menu.menu_main, menu)
val menuItem = menu?.findItem(R.id.menu_search)
val searchView = menuItem?.actionView as SearchView
searchView.setOnQueryTextListener(object: SearchView.OnQueryTextListener {
override fun onQueryTextChange(newText: String?): Boolean {
// 검색어 변경 이벤트
return true
}
override fun onQueryTextSubmit(query: String?): Boolean {
// 키보드의 검색 버튼을 클릭한 순간의 이벤트
return true
}
})
return true
}
MenuItem 객체는 findItem() 함수의 매개변수에 MenuItem의 식별 값을 주어 얻습니다. MenuItem에 등록된 액션 뷰는 actionView 속성으로 얻습니다. 그리고 검색과 관련된 이벤트를 처리할 때는 SearchView의 setonoueryTextListener() 함수로 이벤트 핸들러를 지정합니다.
툴바
툴바를 사용하는 목적은 액션바와 같습니다. 그런데 액션바는 액티비티 창이 자동으로 출력하는 액티비티의 구성 요소지만, 툴바는 개발자가 직접 제어하는 뷰라는 데 차이점이 있습니다.
툴바는 androidx.appcompat.widget.Toolbar 클래스를 이용합니다. 툴바의 목적이 액션바와 같으므로 툴바를 사용하려면 액티비티 테마 설정에서 액션 바가 화면에 출력되지 않게 해주어야 합니다. 그리고 액티비티의 화면을 구성하는 레이아웃 XML 파일에 다음처럼 Toolbar를 등록합니다.
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
style="@style/Widget.MaterialComponents.Toolbar.Primary" />
툴바를 준비했으면 코드에서 액션바의 내용이 툴바에 적용되도록 지정해 줘야 합니다. 이때는 setSupportActionBar(binding.toolbar) 구문을 이용합니다.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
//(...생략 ..)
setSupportActionBar(binding.toolbar)
}
}
호환성을 고려한 기본 뷰 클래스
플랫폼 API에서 제공하는 기본 뷰를 appcompat 라이브러리에서도 제공합니다. 예를 들어 플랫폼 API에서 문자열을 출력하는 TextView 클래스를 appcompat 라이브러리에서는 App CompatTextView라는 클래스명으로 제공합니다.
App CompatTextView이외에도 AppCom patEditText, AppCompatButton, AppCompatCheckBox, AppCompatRadioButton 등 기본 뷰에 해당하는 뷰들을 제공합니다. 이렇게 appcompat 라이브러리에서 기본 뷰들을 제공하는이유는 호완성 문제를 해결하기 위해서입니다. 기본 뷰들을 사용할 때 여러 함수들의 이용할 때가 있습니다. 이것들을 그냥 썼을 때 호완성 문제가 발생할수도 있기 때문에 그 점들을 고려해야 합니다. 그렇지만 appcompat 라이브러리에서제공하는 함수를 쓴다면 호완성 문제를 걱정할 필요가 없어집니다.