프로그래밍/안드로이드

안드로이드 - 뷰객체를 롱터치하면 나타나는 컨텍스트 메뉴

가카리 2015. 8. 2. 17:43
반응형

컨텍스트 메뉴는 어떤 컴포턴트를 롱 터치를 하게되면 나오는 메뉴를 말한다.


컨텍스트 메뉴를 달고 싶은 뷰는 다음 메소드를 이용해서 등록한다.


void Activity.registerForContextMenu(View view)


보통 액티비티의 onCreate 메소드에서 등록하며 여러 개의 뷰를 동시에 등록할 수도 있다.


등록해 놓으면 View.OnCreateContextMenuListener가 액티비티 자신으로 등록되고 뷰 위에서 롱 클릭이 검출되면 다음 메서드를 호출한다.


void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo)


v가 롱클릭이 발생한 뷰를 뜻한다.


컨텍스트 메뉴의 항목을 선택하면 다음 콜백 메소드가 호출된다.


boolean onContextItemSelected(MenuItem item)


item 인수로 선택한 항목이 전달됨.



다음은 xml 파일입니다. 여기서 유의할 점은 drawable 폴더에 childs.png라는 사진을 반드시 넣어놔야합니다.


activity_contextmenu.xml


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        android:orientation="vertical"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

         >

         

<Button

    android:id="@+id/button"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:text="Button"

    />

<EditText

    android:id="@+id/edittext"

    android:layout_width="wrap_content"

        android:layout_height="wrap_content"

        android:text="EditText"

        />

<!-- 아래는 커스텀위젯부분임. 패키지명.클래스명으로 정의함 -->

<com.example.ch9_context_menu.MyImage

    android:id="@+id/myimage"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:src="@drawable/childs"

    

    

    />


</LinearLayout>




다음은 Contextmenu.java 파일입니다.


package com.example.ch9_context_menu;


import android.app.Activity;

import android.content.Context;

import android.graphics.Color;

import android.os.Bundle;

import android.util.AttributeSet;

import android.view.ContextMenu;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.view.ContextMenu.ContextMenuInfo;

import android.widget.Button;

import android.widget.EditText;

import android.widget.ImageView;

import android.widget.Toast;


public class Contextmenu extends Activity {

        

        Button mBtn;

        EditText mEdit;

        MyImage mImage;

        

        

        @Override

        protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_contextmenu);

        

        

        //아래 registerForContextMenu 메소드를 통해서 컨텍스트 메뉴를 사용한다는 것을 등록

        mBtn = (Button)findViewById(R.id.button);

        registerForContextMenu(mBtn);

        

        mEdit = (EditText)findViewById(R.id.edittext);

        registerForContextMenu(mEdit);

        

        mImage = (MyImage)findViewById(R.id.myimage);

        registerForContextMenu(mImage);

        }


        @Override

        public void onCreateContextMenu(ContextMenu menu, View v,

        ContextMenuInfo menuInfo) {

        // TODO Auto-generated method stub

        super.onCreateContextMenu(menu, v, menuInfo);

        

        

        //버튼에 대한 컨텍스트 메뉴를 정의함

        //두번째 인수 v 롱클릭한 뷰임

        if(v == mBtn){

        menu.setHeaderTitle("Button Menu");

        menu.add(0,1,0,"RED");//두번째 인자는 ItemId

        menu.add(0,2,0,"Green");

        menu.add(0,3,0,"Blue");

        }

        

        if(v == mEdit){

        menu.add(0,4,0,"번역하기");

        menu.add(0,5,0,"필기 인식");

        }

        }

        

        @Override

        public boolean onContextItemSelected(MenuItem item) {

        // TODO Auto-generated method stub

        

        //여기가 실제 메뉴가 선택됬을때의 처리하는 부분임

        switch(item.getItemId()){

        case 1:

        mBtn.setTextColor(Color.RED);

        return true;

        case 2:

        mBtn.setTextColor(Color.GREEN);

        return true;

        case 3:

        mBtn.setTextColor(Color.BLUE);

        return true; 

        case 4:

        Toast.makeText(this, "번역완료", Toast.LENGTH_SHORT).show();

        return true;

        case 5:

        Toast.makeText(this, "필기완료", Toast.LENGTH_SHORT).show();

        return true; 

        case 100:

        Toast.makeText(this, "회전완료", Toast.LENGTH_SHORT).show();

        return true;

        case 101:

        Toast.makeText(this, "크기변경", Toast.LENGTH_SHORT).show();

        return true; 

        }

        

        return true;

        

        

        }

}



class MyImage extends ImageView{


        public MyImage(Context context) {

        super(context);

        // TODO Auto-generated constructor stub

        }

        

        public MyImage(Context context, AttributeSet attrs){

        super(context, attrs);

        }

        

        //커스텀 뷰의 경우 아래에서 정의를 하게됨.

        public void onCreateContextMenu(ContextMenu menu){

        super.onCreateContextMenu(menu);

        

        menu.setHeaderTitle("MyImage Menu");

        menu.add(0, 100, 0, "이미지 회전");

        menu.add(0, 101, 0, "크기 변경");

        }

        

        

}

실행화면


앱의 실행화면입니다.

 

버튼을 롱터치 했을때 컨텍스트 메뉴가 뜨는것을 볼 수 있습니다.

 

 

RED를 누르면 위와같이 Button이 빨간색으로 된 것을 알 수 있습니다.






반응형