상세 컨텐츠

본문 제목

[안드로이드 코틀린] 동적 메뉴(ActionMode) 만드는 방법

안드로이드

by aries574 2022. 8. 25. 16:04

본문


이번 시간에는 메뉴를 원할 때만 보여주는 동적 메뉴 만드는 방법을 알아보겠습니다.

메뉴 폴더 만드는 방법과 파일 만드는 방법은 이전 포스팅을 보시면 됩니다.

2022.08.23 - [안드로이드] - [안드로이드 코틀린] 옵션 메뉴(OptionMenu), 서브메뉴(Sub Menu) 만드는 방법

 

[안드로이드 코틀린] 옵션메뉴(OptionMenu), 서브메뉴(Sub Menu) 만드는 방법

이번 시간에는 점 3개 이미지로 익숙한 옵션 메뉴(OptionMenu)와 서브메뉴(Sub Menu) 만드는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 메뉴 Menu 3. 메인 코드 MainActivity.kt 1. 실행 화면 2. ..

aries574.tistory.com


목차

1. 실행 화면
2. 동적 메뉴 dynamic_menu.xml
3. 테마 themes.xml
4. 메인 화면 activity_main.xml
5. 메인 코드 MainActivity.kt


1. 실행 화면

 

2. 동적 메뉴 dynamic_menu.xml

- 설명 -

 1. 동적 메뉴에 쓰이는 아이템

 2. 아이콘 res -> drawable

ic_share.xml
0.00MB
ic_delete.xml
0.00MB

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/menu_delete"
        android:icon="@drawable/ic_delete"
        android:title="Delete"/>
    <item
        android:id="@+id/menu_share"
        android:icon="@drawable/ic_share"
        android:title="Share"/>
</menu>

 

3. 테마 themes.xml

 - 설명 -

  1. 동적 메뉴가 보이는 액션바 색상 설정

  2.  style 태그 안에 추가하면 됩니다.

<item name="actionModeBackground">@color/purple_500</item>

 


4. 메인 화면 activity_main.xml

- 설명 -

  1. 동적 메뉴 호출하는 Button

<?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"
    android:id="@+id/rootView"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:text="길게 눌러보세요"/>

    <Button
        android:id="@+id/btn_dynamic"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:text="동적 메뉴"/>
</LinearLayout>

 

5. 메인 코드 MainActivity.kt

- 설명 -

  1. startActionMode

   동적메뉴 호출

  2. onCreateActionMode

   액션 모드 생성 시 호출

  3. onPrepareActionMode

   액션 모드 준비 시 호출

  4. onActionItemClicked

   액션 모드 아이템 선택 시 호출

  5. onDestroyActionMode

   액션 모드 끝나면 호출

class MainActivity : AppCompatActivity(){

    lateinit var rootView: LinearLayout

    var actionMode: ActionMode? = null

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

        rootView = findViewById(R.id.rootView)

        val textView: TextView = findViewById(R.id.textView)

        //컨텍스트 메뉴 연결
        registerForContextMenu(textView)

        //버튼 이벤트
        val btnDynamic: Button = findViewById(R.id.btn_dynamic)
        btnDynamic.setOnLongClickListener {

            //액션모드 값이 있다면
            if(actionMode != null){
                false
            }

            //동적 메뉴 실행
            actionMode = startActionMode(mActionModeCallback)
            true
        }

    }//onCreate

    //액션모드 설정
    private val mActionModeCallback: ActionMode.Callback = object : ActionMode.Callback{

        //액션모드 생성시 호출
        override fun onCreateActionMode(mode: ActionMode, menu: Menu?): Boolean {

            val menuInflater = mode.menuInflater
            menuInflater.inflate(R.menu.dynamic_menu, menu)
            return true
        }

        //액션모드 준비 시 호출
        override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean {
            return false
        }

        //액션모드 아이템 선택 시 호출
        override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean {

            return when(item.itemId){
                R.id.menu_delete ->{
                    Toast.makeText(applicationContext,"삭제 모드", Toast.LENGTH_SHORT).show()
                    mode.finish()
                    true
                }

                R.id.menu_share -> {
                    Toast.makeText(applicationContext,"공유 모드", Toast.LENGTH_SHORT).show()
                    mode.finish()
                    true
                }

                else -> false
            }
        }

        //액션모드 끝나면 호출
        override fun onDestroyActionMode(p0: ActionMode) {
            actionMode = null
        }

    }


    /**
     * 컨텍스트메뉴 설정
     */
    override fun onCreateContextMenu(
        menu: ContextMenu?,
        v: View?,
        menuInfo: ContextMenu.ContextMenuInfo?
    ) {
        super.onCreateContextMenu(menu, v, menuInfo)

        val inflater: MenuInflater = menuInflater

        inflater.inflate(R.menu.context_menu, menu)
    }


    /**
     * 컨텍스트메뉴 선택 기능
     */
    override fun onContextItemSelected(item: MenuItem): Boolean {

        when(item.itemId){

            R.id.menu_red -> {
                rootView.setBackgroundColor(Color.RED)
                return true
            }

            R.id.menu_blue -> {
                rootView.setBackgroundColor(Color.BLUE)
                return true
            }

            R.id.menu_green -> {
                rootView.setBackgroundColor(Color.GREEN)
                return true
            }

            else -> return false

        }
    }

    /**
     * 옵션메뉴 설정
     */
    override fun onCreateOptionsMenu(menu: Menu?): Boolean {

        val inflater: MenuInflater = menuInflater
        inflater.inflate(R.menu.option_menu, menu)

        return true
    }

    /**
     * 옵션메뉴 선택 기능
     */
    override fun onOptionsItemSelected(item: MenuItem): Boolean {

        when(item.itemId){
            R.id.item1 -> {
                Toast.makeText(this, "아이템1 선택", Toast.LENGTH_SHORT).show()
                return true
            }
            R.id.item2 -> {
                Toast.makeText(this, "아이템2 선택", Toast.LENGTH_SHORT).show()
                return true
            }
            R.id.item3 -> {
                Toast.makeText(this, "아이템3 선택", Toast.LENGTH_SHORT).show()
                return true
            }
            R.id.subItem1 -> {
                Toast.makeText(this, "서브아이템1 선택", Toast.LENGTH_SHORT).show()
                return true
            }
            R.id.subItem2 ->{
                Toast.makeText(this, "서브아이템2 선택", Toast.LENGTH_SHORT).show()
                return true
            }

            else -> return false
        }
    }
}

 

 

2022.08.24 - [안드로이드] - [안드로이드 코틀린 ] 콘텍스트 메뉴(ContextMenu) 바탕화면 변경하는 방법

 

[안드로이드 코틀린 ] 컨텍스트메뉴(ContextMenu) 바탕화면 변경하는 방법

이번 시간에는 PC에서 마우스 오른쪽 누르면 나오는 메뉴 ContextMenu를 통해 바탕화면 변경하는 방법을 알아보겠습니다. 메뉴 폴더 만드는 방법과 파일 만드는 방법은 이전 포스팅에 이어서 하니

aries574.tistory.com

2022.08.22 - [안드로이드] - [안드로이드 코틀린] 텍스트뷰(TextView) 다양하게 꾸며보는 방법

 

[안드로이드 코틀린] 텍스트뷰(TextView) 다양하게 꾸며보는 방법

이번 시간에는 SpannableString 를 이용해서 텍스트뷰 꾸미는 방법에 대하여 알아보겠습니다. 목차 1. 실행 화면 2. 메인 화면 activity_main.xml 3. 메인 코드 MainActivity.kt 1. 실행 화면 2. 메..

aries574.tistory.com

2022.08.19 - [안드로이드] - [안드로이드 코틀린] 속성 애니메이션 (이미지를 움직이게 하는 방법)

 

[안드로이드 코틀린] 속성 애니메이션 (이미지를 움직이게 하는 방법)

이번 시간에는 속성 애니메이션을 통해 아이콘을 가로, 세로, 회전, 사라지고, 보이는 방법을 알아보겠습니다. 목차 1. 실행 화면 2. 메인 화면 activity_main.xml 3. 메인 코드 MainActivity.kt 1. 실..

aries574.tistory.com

 

반응형

관련글 더보기

댓글 영역