반응형

Ex16ContextMenu

안드로이드 네이티브 앱 개발 수업 예제#16

주요코드

ContextMenu 추가하기 [뷰를 꾹~ 누르고 있으면(long click) 팝업되어 보여지는 메뉴 : 데스크탑에서의 마우스 오른쪽버튼 메뉴 역할]

  • 메뉴을 추가하고 싶은 뷰(이 예제에서는 Button)을 ContextMunu로 등록(registerForContextMenu())
  • ContextMenu를 만들기 위한 메소드 onCreateContextMenu() 오버라이드
  • ContextMenu도 OptionMenu만드는 방식과 동일함
  • XML언어로 메뉴항목들을 설계하고 자바언어의 MenuItem객체로 만들어서(부풀리다inflate) Menu에 추가하는 방법을 사용함.res폴더>>menu폴더 생성 [ res폴더에서 마우스오른쪽버튼 메뉴에서 'Android Resource Directory' 선택 후 위에서 2번째 항목의 'Resource Type'에서 'menu'선택하면 menu폴더 추가됨] menu폴더에 있는 context.xml문서를 읽어와서 Menu객체로 만들어주는(부풀려주는inflate) 객체인 MenuInflater사용
  • ContextMenu의 Menu(MenuItem)클릭 반응하기

실행모습

 

 

실행모습 GIF

 

 

소스코드

버튼의 롱~클릭으로 나타날 컨텍스트 메뉴에 보여줄 메뉴의 항목들 Menu Resource로 설계

 

- res폴더>>menu폴더 생성 [ res폴더에서 마우스오른쪽버튼 메뉴에서 'Android Resource Directory' 선택 후 위에서 2번째 항목의 'Resource Type'에서 'menu'선택하면 menu폴더 추가됨 

- 추가된 menu 폴더에서 마우스오른쪽버튼 메뉴에서 [ New > Menu Reource File ]선택하여 file name 칸에 "context"을 쓰고 [OK]를 누르면 메뉴리소스파일 이 만들어 짐.

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

    <item android:id="@+id/menu_save"
        android:title="Save"/>

    <item android:id="@+id/menu_delete"
        android:title="Delete"/>
    <!-- ContextMenu는 기본적으로 icon이 적용되지 않음  -->

</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"
    android:padding="16dp"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="show Context Menu"
        android:onClick="clickBtn"/>

</LinearLayout>

 

 

# MainActivity.java
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    Button btn;

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

        btn= findViewById(R.id.btn);

        //액티비티에게 btn객체를 ContextMenu로 등록
        registerForContextMenu(btn);
    }

    //ContextMenu로 등록된 뷰가 롱클릭되면
    //컨텍스트메뉴를 만드는 메소드가 자동으로 실행되는 콜백메소드..
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {

        //OptionMenu와 만드는 방법은 동일함.
        //res폴더>>menu폴더>>context.xml 파일을 만들어서 메뉴항목들 작성
        //context.xml파일을 메뉴객체로 생성(부플리다..)
        MenuInflater inflater= getMenuInflater();
        inflater.inflate(R.menu.context, menu);

        super.onCreateContextMenu(menu, v, menuInfo);
    }

    //콘텍스트메뉴의 아이템을 선택했을때 자동으로 실행되는 콜백메소드..
    @Override
    public boolean onContextItemSelected(MenuItem item) {

        //context.xml파일에 작성한 메뉴항목들의 id를 식별하여 토스트 보여주기
        switch ( item.getItemId() ){
            case R.id.menu_save:
                Toast.makeText(this, "SAVED", Toast.LENGTH_SHORT).show();
                break;

            case R.id.menu_delete:
                Toast.makeText(this, "DELETED", Toast.LENGTH_SHORT).show();
                break;
        }

        return super.onContextItemSelected(item);
    }

    // 기본적인 버튼으로서의 클릭이벤트 동작 확인 콜백메소드...
    public void clickBtn(View v){
        Toast.makeText(this, "click", Toast.LENGTH_SHORT).show();
    }
}
반응형

+ Recent posts