안드로이드 - 컨텍스트 메뉴 사용 예제
2022. 12. 8. 15:03ㆍBasic
- 컨텍스트 메뉴(Context Menu)는 특정 뷰(View)에 대한 메뉴를 제공합니다.
- 컨텍스트 메뉴(Context Menu)는 뷰(View)를 길게 눌렀을 때 활성화됩니다.
1. 컨텍스트 메뉴 구현과정
특정 뷰(View)가 컨텍스트 메뉴(Context Menu)가 동작하는 뷰(View)로 등록하기 위해서는 액티비티의 registerForContextMenu(View view) 함수를 사용합니다.
2. 액티비티 메인 레이아웃
<?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"
app:layoutDescription="@xml/activity_main_scene"
tools:context=".MainActivity">
<TextView
android:id="@+id/textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:text="목록"
android:textAppearance="@style/TextAppearance.AppCompat.Large" />
</LinearLayout>
3.컨텍스트메뉴 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/item"
android:title="아이템1"
/>
<item
android:id="@+id/item2"
android:title="아이템2">
</item>
</menu>
4. 액티비티 메인 코틀린 코드
package com.example.contextmenu
import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.ContextMenu
import android.view.ContextMenu.ContextMenuInfo
import android.view.MenuItem
import android.view.View
import android.widget.ArrayAdapter
import android.widget.ListView
import android.widget.TextView
import com.example.contextmenu.databinding.ActivityMainBinding
import org.w3c.dom.Text
class MainActivity : AppCompatActivity() {
private var mainBinding: ActivityMainBinding? = null
private val binding get() = mainBinding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val textview = binding.textview
registerForContextMenu(textview)
registerForContextMenu(binding.list1)
}
override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenuInfo?) {
super.onCreateContextMenu(menu, v, menuInfo)
when (v?.id) {
R.id.textview -> {
menu?.setHeaderTitle("버튼의메뉴")
menuInflater.inflate(R.menu.menu1, menu)
}
}
}
override fun onContextItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.item -> {
binding.textview.text = "버튼1의메뉴를눌럿습니다"
}
R.id.item2 -> {
binding.textview.text = "버튼2의메뉴를눌럿습니다"
}
}
return super.onContextItemSelected(item)
}
}
- onCreate() 함수에서는 TextView 객체를 받아와 registerForContextMenu() 함수를 통해서 해당 뷰(View)에 Context Menu를 등록합니다.
- onCreateContextMenu() 함수를 재정의하여 Inflater를 통해 Menu 리소스에 정의된 내용을 파싱 하여 컨텍스트 메뉴(Context Menu)를 생성합니다.
- onContextItemSelected() 함수를 재정의합니다. 선택 된 MenuItem에 따라 분기하여 TextView의 text을 지정해주고 있습니다.
- 다음은 Listview를 메인xml에 추가해 리스트항목을 만들겟습니다.
<ListView
android:id="@+id/list1"
android:layout_width="match_parent"
android:layout_height="match_parent" />
- 컨텍스트 메뉴2.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/list_item1"
android:title="리스트의메뉴1" />
<item
android:id="@+id/list_item2"
android:title="리스트의메뉴2" />
</menu>
- 메인 액티비티 코드
- OnCreate() 함수에 arrayof()을 담을수잇게 data1변수를생성합니다.
- 배열형태의 데이터를처리하기위해 adapter란 변수를만들엇습니다.
package com.example.contextmenu
import android.graphics.Color
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.ContextMenu
import android.view.ContextMenu.ContextMenuInfo
import android.view.MenuItem
import android.view.View
import android.widget.ArrayAdapter
import android.widget.ListView
import android.widget.TextView
import com.example.contextmenu.databinding.ActivityMainBinding
import org.w3c.dom.Text
class MainActivity : AppCompatActivity() {
private var mainBinding: ActivityMainBinding? = null
private val binding get() = mainBinding!!
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
mainBinding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val data1 = arrayOf(
"항목1", "항목2", "항목3", "항목4", "항목5"
)
val adapter = ArrayAdapter(this, android.R.layout.simple_list_item_1, data1)
binding.list1.adapter = adapter
binding.list1.setOnItemClickListener { parent, view, position, id ->
binding.textview.text = "리스트뷰의 항목 클릭 : ${data1[position]}"
}
val textview = binding.textview
//ContextMenu를 View에 등록
registerForContextMenu(textview)
registerForContextMenu(binding.list1)
}
override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenuInfo?) {
super.onCreateContextMenu(menu, v, menuInfo)
when (v?.id) {
R.id.textview -> {
menu?.setHeaderTitle("버튼의메뉴")
menuInflater.inflate(R.menu.menu1, menu)
}
R.id.list1 -> {
menu?.setHeaderTitle("리스트의 메뉴")
menuInflater.inflate(R.menu.menu2,menu)
}
}
}
override fun onContextItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.item -> {
binding.textview.text = "버튼1의메뉴를눌럿습니다"
}
R.id.item2 -> {
binding.textview.text = "버튼2의메뉴를눌럿습니다"
}
R.id.list_item1 -> {
binding.textview.text = "리스트1의 메뉴를 눌렀습니다"
}
R.id.list_item2 -> {
binding.textview.text = "리스트2의 메뉴를 눌렀습니다."
}
}
return super.onContextItemSelected(item)
}
}
'Basic' 카테고리의 다른 글
코틀린 안드로이드 - 계산기 /다이얼로그 만들어보기 (0) | 2022.12.06 |
---|---|
스톱워치 앱 구현하기 (0) | 2022.12.02 |
이메일 화면 구현하기 (0) | 2022.12.01 |