관리 메뉴

드럼치는 프로그래머

[안드로이드] 제11강좌 - OptionMenu & SubMenu 와 ContextMenu 만들기 본문

★─Programing/☆─Android

[안드로이드] 제11강좌 - OptionMenu & SubMenu 와 ContextMenu 만들기

드럼치는한동이 2011. 5. 31. 13:57

@ Menu버튼 눌렀을 때

    onCreateOptionsMenu() 호출

 

============================================================================================================================================

@@@옵션 메뉴와 서브메뉴 @@@

 

@@@ menu.xml @@@  res->menu->menui.xml

<?xml version="1.0" encoding="utf-8"?>
<menu
  xmlns:android="http://schemas.android.com/apk/res/android">
  <item
   android:id="@+id/submenu"
   android:title="Sub Menu">
    <menu>
     <group
      android:id="@+id/group1"
      android:checkableBehavior="all"> //속성값이 all일 경우는 체크박스로 만들어진다

      <item
       android:id="@+id/bigfont"
       android:title="BigFont"/>
     </group>
     <group
      android:id="@+id/ecgoup"
      android:checkableBehavior="single">
      <item
       android:id="@+id/red"
       android:title="Red"
       android:checked="true" />
      <item
       android:id="@+id/blue"
       android:title="Blue"  />
      <item
       android:id="@+id/greeb"
       android:title="Green" />
     </group>
    </menu>
   </item>
</menu>
============================================================================================================================================

@@@ main.xml @@@

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
    <Button
     android:id="@+id/button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="Test"
     android:textColor="#ff00ff00" />
</LinearLayout>

============================================================================================================================================

@@@ java @@@

package com.android.menu;

import android.app.Activity;
import android.os.Bundle;
import android.graphics.*;
import android.view.*;
import android.widget.*;


public class TestMenu extends Activity {
    /** Called when the activity is first created. */
 Button mBtn;
 
    @Override
    public void onCreate(Bundle savedInstanceState) { //속성 조사 및 변경 대상인 버튼을 미리 구해 mBtn 멤버에 대입
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        mBtn = (Button)findViewById(R.id.button);
    }
    public boolean onCreateOptionsMenu(Menu menu){  // onCreateOptionsMenu() - Xml리소스를 전개하여 메뉴를 붙인다.

                                                                                  // 최초 메뉴를 생성할 때 한번만 호출.
     MenuInflater inflater = getMenuInflater();
     inflater.inflate(R.menu.menu, menu);//메뉴항목에서 불러옴
  return true;
    }
    public boolean onPrepareOptionsMenu(Menu menu){

             //버튼의 현재 속성을 읽어 멘들의 상태를 갱신. 메뉴를 열때마다 호출
     if(mBtn.getTextSize() == 40){
      menu.findItem(R.id.bigfont).setChecked(true);//메뉴아이템을 코드에서 접근하는 방법 findItem,,setChecked()
     }
     else{
      menu.findItem(R.id.bigfont).setChecked(false);
     }
     int color = mBtn.getTextColors().getDefaultColor();
     //코드에서 칼라를 바꾸는 방법,,버튼의getTextColors().getDefaultColor()로 꺼내야 함
     if(color == Color.RED){
      menu.findItem(R.id.red).setChecked(true);
     }
     if(color == Color.GREEN){
      menu.findItem(R.id.green).setChecked(true);
     }
     if(color == Color.BLUE){
      menu.findItem(R.id.blue).setChecked(true);
     }
     return true;
    }
    public boolean onOptionsItemSelected(MenuItem item){

                //onOptionsItemSelected() 메뉴가 선택될 때 메뉴의 의미에 대응되는 메서드르 ㄹ호출하여 버튼의 속성을 변경
     switch (item.getItemId()){
     case R.id.bigfont:
      if(item.isChecked()){
       mBtn.setTextSize(20);
      }else{
       mBtn.setTextSize(40);
      }
      return true;
     case R.id.red:
      mBtn.setTextColor(Color.RED);
      return true;
     case R.id.green:
      mBtn.setTextColor(Color.GREEN);
      return true;
     case R.id.blue:
      mBtn.setTextColor(Color.BLUE);
      return true;
      
     }
     return true;
    }
}

============================================================================================================================================

@@@@ 컨텍스트 메뉴 - 오래 누루고 있을때 발생하는 메뉴 @@@

- 뷰를 롱 클릭하거나 키패드의 가운데 버튼을 누르면 화면 중앙에 컨텍스트 메뉴가 열린다.

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

  메뉴 등록   public void registerForContextMenu(View view)   # 메뉴가 아니라 뷰다.

                    View.OnCreateContextMenuListener가 액티비티 자신으로 등록됨.  이벤트를 생성

                               onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuinfo menuinfo)

                                                   #menuinfo - 표시해야 할 메뉴에 대한 세부 정보, 뷰에 제공되는 것이 달라짐.

컨택스트 항목을 선택하면 다음 메소드가 호출

- public boolean onContextItemSelected(MenuItem item)

   item : 선택한 항목이 전달되므로 이 항목에 따라 대응되는 동작을 수행한다.

                

============================================================================================================================================

@@@ main @@@

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView 
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/hello"
    />
    <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.android.context.MyImage    // 안드로이드에 있는 것이 아니라 내가 만든 것이라서 exam.package명.class명 을 입력해줘야 함.
     android:id="@+id/myimage"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:src="@drawable/childs" /> //drawable폴더를 생성하고 그곳에 그림을 childs 라는 이름으로 지정해준다
</LinearLayout>
============================================================================================================================================

@@@ java @@@

package com.android.context;

import android.app.Activity;
import android.content.*;
import android.os.Bundle;
import android.graphics.*;
import android.util.*;
import android.widget.*;
import android.view.*;


public class TestContext extends Activity {
    /** Called when the activity is first created. */
 
 //context를 사용 하기 위해서 전역변수로 선언함
 Button mBtn;
 EditText mEdit;
 MyImage mImage;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        mBtn =(Button)findViewById(R.id.button);
        registerForContextMenu(mBtn);
        mEdit =(EditText)findViewById(R.id.edittext);
        registerForContextMenu(mEdit);
        mImage =(MyImage)findViewById(R.id.myimage);
        registerForContextMenu(mImage);
    }
    public void onCreateContextMenu(ContextMenu menu,View v, ContextMenu.ContextMenuInfo menuInfo){
     super.onCreateContextMenu(menu, v, menuInfo);
     
     if(v==mBtn){
      menu.setHeaderTitle("Button Menu");
      menu.add(0,1,0,"RED");
      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,"필기인식");
     }
    }
    public boolean onContextItemSelected(MenuItem item){
     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);
 }
 
 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,"크기변경");
 }
}

Comments