안드로이드 - 컨텍스트 메뉴 사용 예제

2022. 12. 8. 15:03Basic

  • 컨텍스트 메뉴(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)
    }
}