안드로이드 개발자의 창고
[41일차 Android] ActionView 본문
출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT
📖 ActionView
- ActionBar에 View를 배치하고 이를 접었다 폈다 할 수 있는 개념
- 주로 검색 기능을 만들 때 사용한다.
예제 코드
menu/main_menu.xml
<?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="SearchBar"
app:showAsAction="always|collapseActionView"
app:actionViewClass="androidx.appcompat.widget.SearchView"/>
</menu>
- collapseActionView
- 사용자가 위젯과 상호작용하지 않을 때 위젯을 표시하는 방법을 나타낸다.
- 위젯이 앱 바에 있는 경우 앱은 위젯을 아이콘으로 표시한다.
- 위젯이 더보기 메뉴에 있는 경우 앱은 위젯을 메뉴 항목으로 표시한다.
- 사용자가 작업 뷰와 상호작용할 때는 위젯이 확장되어 앱 바를 채운다.
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
<TextView
android:id="@+id/textView3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
<ListView
android:id="@+id/list1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
MainActivity.kt
class MainActivity : AppCompatActivity() {
lateinit var activityMainBinding: ActivityMainBinding
// listView의 데이터
val data1 = arrayOf(
"aaaa", "bbbb", "cccc", "aabb", "ccdd"
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(activityMainBinding.root)
activityMainBinding.run{
list1.run{
adapter = ArrayAdapter<String>(
this@MainActivity, android.R.layout.simple_list_item_1, data1
)
// listView가 검색이 가능하도록 설정
isTextFilterEnabled = true
setOnItemClickListener { adapterView, view, i, l ->
// listView에서 i번째 항목의 문자열 값을 가져온다.
val str1 = adapterView.adapter.getItem(i) as String
// 해당 문자열이 몇 번째에 있는지 확인한다.
val idx = data1.indexOf(str1)
activityMainBinding.textView3.text = data1[idx]
}
}
}
}
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main_menu, menu)
// SearchView를 가지고 있는 MenuItem을 가져온다.
val item1 = menu?.findItem(R.id.item1)
// SearchView 추출
val searchView = item1?.actionView as SearchView
// 안내 문구를 설정한다.
searchView.queryHint = "검색어 입력"
// ActionView가 펼쳐지거나 접혔을 때
item1.setOnActionExpandListener(object : MenuItem.OnActionExpandListener{
// 펼쳐졌을 때
// true를 반환하면 펼쳐지고 false를 반환하면 펼치지지 않는다.
override fun onMenuItemActionExpand(p0: MenuItem): Boolean {
activityMainBinding.textView.text = "펼쳐 졌을 때"
return true
}
// 접혔을 때
// true를 반환하면 접혀지고 false를 반환하면 접혀지지 않는다.
override fun onMenuItemActionCollapse(p0: MenuItem): Boolean {
activityMainBinding.textView.text = "접혀 졌을 때"
return true
}
})
// SerachView의 리스너
searchView.setOnQueryTextListener(object : SearchView.OnQueryTextListener{
// 문자열 입력이 완료되었을 때
override fun onQueryTextSubmit(query: String?): Boolean {
activityMainBinding.textView.text = "문자열 입력 완료"
activityMainBinding.textView2.text = "입력 완료 : $query"
searchView.clearFocus()
// ActionView를 접어준다.
item1.collapseActionView()
return true
}
// 입력 중에 호출되는 메서드
override fun onQueryTextChange(newText: String?): Boolean {
activityMainBinding.textView.text = "문자열 입력중"
activityMainBinding.textView2.text = "입력 중 : $newText"
// ListView 검색어 설정
activityMainBinding.list1.setFilterText(newText)
// 검색어가 없으면 필터를 초기화
if(newText?.length == 0){
activityMainBinding.list1.clearTextFilter()
}
return true
}
})
return super.onCreateOptionsMenu(menu)
}
}
결과
ListView의 항목 선택 | 검색어 입력 |
![]() |
![]() |
'Computer > Android' 카테고리의 다른 글
[41일차 Android] ToolBar (0) | 2023.07.01 |
---|---|
[41일차 Android] ActionBar Navigation (0) | 2023.07.01 |
[41일차 Android] ActionBar (0) | 2023.07.01 |
[39일차 Android] Fargment (0) | 2023.07.01 |
[39일차 Android] Service (0) | 2023.06.29 |