반응형
Context Menu
- 화면에 배치된 View에 설정하는 메뉴
- 메뉴가 설정된 View를 길게 누르면 메뉴가 나타남
- 리스트뷰와 함께 종종 사용됨 -> 원래 기능대로 항목 터치시 동작 + 항목 길게 터치시 메뉴 나타남 Ex) 게시판이나 음악앱에서 게시글/음악을 길게 누르면 메뉴가 뜸
주요 메서드
registerForContext : Context Menu를 등록하는 메서드, 매개 변수로 넣어준 View 객체에 메뉴가 설정됨
onCreateContextMenu : View를 길게 누르면 호출되는 메서드, 여기서 메뉴를 구성 -> 뷰를 길게 누르면 뷰에 등록했던 ContextMenu 객체가 매개변수로 넘어오게 되고 HeaderTitle 설정과 XML inflate가 진행
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater) // 뷰바인딩 객체
val view = binding.root //뷰바인딩을 통해 레이아웃과 뷰가 결합 -> .root 를 통해 View 객체만를 뽑아내는(?)
setContentView(view)
// ContextMenu를 View에 등록
registerForContextMenu(binding.textView)
}
// ContextMenu를 셋팅한 View 객체를 길게 누르면 메뉴 리스트가 나옴
override fun onCreateContextMenu(
menu: ContextMenu?,
v: View?,
menuInfo: ContextMenu.ContextMenuInfo?
) {
super.onCreateContextMenu(menu, v, menuInfo)
// 길게 누른 View의 id로 분기
when (v?.id) {
R.id.textView -> {
menu?.setHeaderTitle("텍스트뷰의 메뉴")
menuInflater.inflate(R.menu.menu1, menu)
}
}
}
// 메뉴 리스트에서 item 클릭시 동작하는 메서드
override fun onContextItemSelected(item: MenuItem): Boolean {
// 메뉴의 id 값으로 분기
when (item.itemId) {
R.id.item1 -> {
binding.textView.text = "텍스트 뷰의 메뉴1를 눌렀습니다"
}
R.id.item2 -> {
binding.textView.text = "텍스트 뷰의 메뉴2를 눌렀습니다"
}
}
return super.onContextItemSelected(item)
}
💡 리스트뷰와 함께 사용
- 리스트뷰의 항목뷰를 길게 누르면 메뉴가 나타남
- 리스트뷰에 어댑터를 생성하는 과정은 동일 + 리스트뷰에 메뉴 등록
- 길게 누른 항목의 (리스트뷰)인덱스 번호를 알고 싶으면 AdapterContextMenuInfo 객체를 사용해 메뉴객체와 인덱스 번호를 추출할 수 있다
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater) // 뷰바인딩 객체
val view = binding.root //뷰바인딩을 통해 레이아웃과 뷰가 결합 -> .root 를 통해 View 객체만를 뽑아내는(?)
setContentView(view)
val adapter1 = ArrayAdapter(this, android.R.layout.simple_list_item_1, data1)
binding.list1.adapter = adapter1
binding.list1.setOnItemClickListener { adapterView, view, i, l ->
binding.textView.text = "리스트뷰의 항목 클릭 : ${data1[i]}"
}
// 리스트뷰에 ContextMenu를 등록
registerForContextMenu(binding.list1)
}
// ContextMenu를 셋팅한 View 객체를 길게 누르면 메뉴 리스트가 나옴
override fun onCreateContextMenu(
menu: ContextMenu?,
v: View?,
menuInfo: ContextMenu.ContextMenuInfo? //adapterContextMenuInfo 클래스로 만들어진 객체
) {
super.onCreateContextMenu(menu, v, menuInfo)
// 길게 누른 View의 id로 분기
when (v?.id) {
R.id.textView -> {
menu?.setHeaderTitle("텍스트뷰의 메뉴")
menuInflater.inflate(R.menu.menu1, menu)
}
R.id.list1 -> {
// 사용자가 길게 누른 항목의 인덱스 번호를 파악하기 위해...
//println("${menuInfo?.javaClass}")
// 코드로 구성할때는 이 방법이 좋을 수 있음
val info = menuInfo as AdapterView.AdapterContextMenuInfo // 형변환 -> 이미 이 클래스 아닌가?...
menu?.setHeaderTitle("리스트뷰의 메뉴 : ${info.position}") // 형변환을 해줘야 position 프로퍼티 사용 가능(차이 찾아보고 공부!!)
//menu?.setHeaderTitle("리스트뷰의 메뉴")
menuInflater.inflate(R.menu.menu2, menu)
}
}
}
// 메뉴 리스트에서 item 클릭시 동작하는 메서드
override fun onContextItemSelected(item: MenuItem): Boolean {
// 리스트뷰 항목의 인덱스 번호를 받을 변수
var position = 0
when (item.itemId) {
R.id.list_item1, R.id.list_item2 -> {
// MenuInfo 객체 추출
val info = item.menuInfo as AdapterView.AdapterContextMenuInfo
position = info.position
}
}
// 메뉴의 id 값으로 분기
when (item.itemId) {
R.id.item1 -> {
binding.textView.text = "텍스트 뷰의 메뉴1를 눌렀습니다"
}
R.id.item2 -> {
binding.textView.text = "텍스트 뷰의 메뉴2를 눌렀습니다"
}
R.id.list_item1 -> {
binding.textView.text = "리스트 뷰의 항목 ${position + 1} 번 메뉴1를 눌렀습니다"
}
R.id.list_item2 -> {
binding.textView.text = "리스트 뷰의 항목 ${position + 1} 번 메뉴2를 눌렀습니다"
}
}
return super.onContextItemSelected(item)
}
반응형
'Android' 카테고리의 다른 글
[안드로이드/Activity] Activity란 무엇인가? (0) | 2023.03.08 |
---|---|
[안드로이드/Menu] Popup Menu (0) | 2023.03.08 |
[안드로이드/Menu] Option Menu (0) | 2023.03.05 |
[안드로이드/권한] 권한 등록 및 허가 (0) | 2023.03.02 |
[안드로이드/AdapterView] RecyclerView (0) | 2023.03.01 |