본문 바로가기
Android

[Android] Context Menu(컨텍스트 메뉴)

by jane.dev 2021. 10. 27.
반응형
Context Menu
전용 Menu 버튼을 제공하지 않아도 됨
사용자가 요소를 길게 클릭하면 나타나는 플로팅 메뉴

 

Activity_main.xml

먼저 길게 클릭하면 Context Menu가 나타날 수 있는 요소인 Button을 LinearLayout에 생성

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center">
    
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/backBtn"
        android:text="배경바꾸기"></Button>
    
</LinearLayout>

 

menu.xml

메뉴를 정의하기 위해서는 프로젝트의 res/menu/ 디렉토리에서 XML파일을 생성하고 요소로 메뉴를 빌드

<?xml version="1.0" encoding="utf-8"?>
<!-- 메뉴 항목의 컨테이너인 Menu를 정의 -->
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 메뉴 내부의 단일 항목을 나타내는 MenuItem 생성 -->
    <item
        android:id="@+id/backRed"
        android:title="배경을 빨간색으로 변경"></item>
    <item
        android:id="@+id/backBlue"
        android:title="배경을 파란색으로 변경"></item>
    <item
        android:id="@+id/backYellow"
        android:title="배경을 노란색으로 변경"></item>
    <item
        android:id="@+id/backGreen"
        android:title="배경을 초록색으로 변경"></item>
</menu>

 

 

MainActivity.java

Button을 클릭하면 배경색을 변경할 수 있는 메뉴가 나타나기 위해 LinearLayout과 Button 을 연결

public class MainActivity extends AppCompatActivity {

    LinearLayout layout;
    Button backBtn;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        layout = (LinearLayout) findViewById(R.id.layout);
        backBtn = (Button) findViewById(R.id.backBtn);
        // registerForContextMenu()를 호출하여 컨텍스트 메뉴를 연결해야하는 버튼을 등록
        registerForContextMenu(backBtn);

    }

    // onCreateContextMenu() 구현 - 긴 클릭 이벤트를 수신하면 시스템에서 해당 메서드를 호출
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);

        // MenuInflater를 사용하면 메뉴 리소스에서 컨텍스트 메뉴를 확장시킬 수 있음
        MenuInflater menuInflater = getMenuInflater();

        if (v == backBtn) {
            // 기존 레이아웃에 menu를 삽입하기 위해 .inflate(리소스 폴더 내 xml 파일 지정, menu);
            menuInflater.inflate(R.menu.menu1, menu);
        }


    }
    
    // onContextItemSelected() 구현 - 사용자가 메뉴 항목을 선택하면 해당 메서드 호출
    @Override
    public boolean onContextItemSelected(@NonNull MenuItem item) {
        // getItemId() 메서드는 선택된 메뉴 항목의 ID를 쿼리 - 성공적으로 처리시 true를 반환
        // menu.xml에서 각 item에 정의한 ID를 매칭시켜 java코드로 layout의 배경색을 변경
        if(item.getItemId() == R.id.backRed){
            layout.setBackgroundColor(Color.RED);
        }else if(item.getItemId() == R.id.backBlue){
            layout.setBackgroundColor(Color.BLUE);
        }else if(item.getItemId() == R.id.backYellow){
            layout.setBackgroundColor(Color.YELLOW);
        }else if(item.getItemId() == R.id.backGreen){
            layout.setBackgroundColor(Color.GREEN);
        }
        return super.onContextItemSelected(item);
    }

}