반응형
ActionView
- ActionBar 에 View를 배치하고 이를 접었다 폈다 가능
- 주로 검색 기능을 만들 때 사용
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/item1"
android:icon="@android:drawable/ic_menu_search"
android:title="Search"
app:showAsAction="always|collapseActionView"
app:actionViewClass="androidx.appcompat.widget.SearchView"/> <!--하위버전까지 지원할 수 있음. 혹시 안 되면 android로 해보기-->
</menu>
- 뷰로 만들고자 하는 item을 always|collapseActionView 로 설정
- 검색 기능을 하는 뷰를 만들고자 하면 -> SearchView 클래스를 추가
✔️ 리스트뷰에 필터링 기능을 사용해 리스트뷰 어댑터에 세팅된 문자열 항목들을 필터링 가능 -> 간단한 검색 기능 구형
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
val data1 = arrayOf("aaa","bbb","ccc","ddd","eee")
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater) // 뷰바인딩 객체
val view = binding.root //뷰바인딩을 통해 레이아웃과 뷰가 결합 -> .root 를 통해 View 객체만를 뽑아내는(?)
setContentView(view)
val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1,data1)
binding.list1.adapter = adapter
// 검색어 기준으로 필터링 될 수 있도록 설정 (텍스트 필터 기능 사용 설정)
binding.list1.isTextFilterEnabled = true
// SearchView에 적은 문자열을 리스트뷰에 적용해 주면
// adapter에 세팅한 모든 문자열 검색해 일치하는 것만 남기고 나머진 다 사라지게 만듬
}
override fun onCreateOptionsMenu(menu: Menu): Boolean {
menuInflater.inflate(R.menu.menu1,menu)
// SearchView를 가지고 있는 메뉴 아이템 객체를 추출
val item = menu.findItem(R.id.item1)
// SearchView 객체를 가지고 온다.
val search1 = item?.actionView as SearchView
// 안내문구를 설정
search1.queryHint = "검색어 입력"
// 메뉴 아이템에 배치된 뷰가 접히거나 펼쳐질 때 반응하는 리스너 구현 (MenuItem의 리스너)
val listenr1 = object : MenuItem.OnActionExpandListener {
// 접혔을 때 호출
override fun onMenuItemActionCollapse(p0: MenuItem?): Boolean {
//p0 : 접혔다 펼쳤다 할 수 있는 뷰를 가지고 있는 메뉴 아이템 객체의 주솟값
binding.textView.text = "접힘"
return true
}
// 펼쳤을 때 호출
override fun onMenuItemActionExpand(p0: MenuItem?): Boolean {
binding.textView.text = "펼침"
return true
}
}
// 리스너 세팅
item.setOnActionExpandListener(listenr1)
// 검색어를 입력할때 반응하는 리스너 (SearchView의 리스너)
val listener2 = object : SearchView.OnQueryTextListener {
// SearchView에 문자열을 입력할 때마다 호출되는 메서드
override fun onQueryTextChange(newText: String?): Boolean {
binding.textView.text = "문자열 입력중"
binding.textView2.text = "입력중 : ${newText}"
// SearchView에 입력한 내용을 listView의 필터 문자열로 설정 (리스트뷰에서 그냥 바로 필터링 해줌!)
// 리스트뷰의 문자열을 필터링. 검색 기능과는 조금은 다를 수 있음 -> 구체적인 검색기능은 구현해야 하지만 쉽게 가능
binding.list1.setFilterText(newText)
// 만약 설정한 문자열 길이가 0이라면 필터 문자열을 제거
if (newText?.length == 0) {
binding.list1.clearTextFilter()
}
return true
}
// 키보드의 돋보기 버튼(검색완료)을 눌렀을 때 호출되는 메서드
override fun onQueryTextSubmit(query: String?): Boolean {
binding.textView.text = "문자열 입력 완료"
binding.textView2.text = "입력완료 : ${query}"
search1.clearFocus() // 키보드 사라짐
return true
}
}
search1.setOnQueryTextListener(listener2)
return true
}
}
반응형
'Android' 카테고리의 다른 글
[안드로이드/ActionBar] ActionBar 커스텀 (0) | 2023.04.25 |
---|---|
[안드로이드/ActionBar] ActionBar Navigation (0) | 2023.04.25 |
[안드로이드/ActionBar] ActionBar 란? (0) | 2023.04.25 |
[안드로이드/Activity] Activity Animation (0) | 2023.04.22 |
[안드로이드/Fragment] Fragment Animation (0) | 2023.04.22 |