티스토리 뷰

반응형

뷰에 설정할 수 있고 뷰를 길게 누르면 메뉴가 나타난다.

 

 

context menu에 필요한 함수는 아래와 같습니다.

 

  • registerForContext - context menu를 등록하는 함수
  • onCreateContextMenu - 뷰를 길게 누르면 호출되는 함수
  • onContextItemSelected - 메뉴 클릭 시 발생하는 함수

 

 

XML 수정하기

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="wrap_content"
        android:layout_height="wrap_content"
        android:text="text"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"/>

</LinearLayout>

 

 

menu 만들기

res > New > Android Resource File을 클릭한 후

 

Resource type을 menu로 설정한 후 생성을 합니다.

 

 

menu의 xml을 아래와 같이 수정해줍니다.

 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/item1"
        android:title="1" />
    <item
        android:id="@+id/item2"
        android:title="2" />
</menu>

 

 

코드 작성하기

 

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        registerForContextMenu(textView)
    }

    override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) {
        super.onCreateContextMenu(menu, v, menuInfo)

        when(v?.id) {
            R.id.textView -> {
                menu?.setHeaderTitle("메뉴")
                menuInflater.inflate(R.menu.textview_menu, menu)
            }
        }
    }
}

 

registerForContextMenu를 통해 context menu를 설정할 id를 넣어줍니다.

onCreateContextMenu를 통해 길게 누를 시 context menu가 보이도록 설정합니다.

 

실행을 하면 아래와 같습니다.

 

 

 

이제 메뉴를 눌렀을 때 동작하는 코드를 작성하겠습니다.

 

아래 코드를 추가해줍니다.

override fun onContextItemSelected(item: MenuItem): Boolean {

    when(item.itemId) {
        R.id.item1 -> textView.text = "1번 클릭"
        R.id.item2 -> textView.text = "2번 클릭"
    }

    return super.onContextItemSelected(item)
}

 

onContextItemSelected를 통해 구현을 하였습니다.

 

실행 결과는 아래와 같습니다.

 

 

 

ListView에 Context Menu 사용하기

 

listview에 context menu를 사용해보겠습니다.

 

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="wrap_content"
        android:layout_height="wrap_content"
        android:text="text"
        android:textAppearance="@style/TextAppearance.AppCompat.Large"/>
    
    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>

 

 

그리고 MainActivity에서 데이터를 넣어줍니다.

 

class MainActivity : AppCompatActivity() {

    private val data = arrayOf("1", "2", "3", "4", "5", "6", "7")

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val adapter = ArrayAdapter(this, android.R.layout.simple_expandable_list_item_1, data)
        
        listView.adapter = adapter
    }
}

 

실행을 하면 아래와 같이 리스트 뷰가 보입니다.

 

 

아래 코드를 통해 리스트 뷰 클릭 이벤트를 추가해줍니다.

listView.setOnItemClickListener { _, _, i, _ ->
    textView.text = "${i + 1} 번째 클릭"
}

 

실행하면 아래와 같습니다.

 

 

 

listview에 쓰일 menu를 하나 만들어줍니다.

 

그리고 xml을 아래와 같이 수정해줍니다.

 

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:id="@+id/listView_item1"
        android:title="1" />
    <item
        android:id="@+id/listView_item2"
        android:title="2" />
</menu>

 

 

onCreate와 onCreateContextMenu를 아래와 같이 수정합니다.

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
		...
        
        registerForContextMenu(listView)
    }

    override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) {
        super.onCreateContextMenu(menu, v, menuInfo)

			...
            
            R.id.listView -> {
                menu?.setHeaderTitle("리스트 뷰")
                menuInflater.inflate(R.menu.listview_menu, menu)
            }
        }
        
        override fun onContextItemSelected(item: MenuItem): Boolean {

        when(item.itemId) {
            R.id.item1 -> textView.text = "1번 클릭"
            R.id.item2 -> textView.text = "2번 클릭"

            R.id.listView_item1 -> textView.text = "리스트 뷰 1번 클릭"
            R.id.listView_item2 -> textView.text = "리스트 뷰 2번 클릭"
        }

        return super.onContextItemSelected(item)
    }
}

 

실행을 하면 아래와 같이 동작을 합니다.

 

 

 

 

반응형
댓글