Download presentation
Presentation is loading. Please wait.
1
6 메 뉴
2
학습목표 메뉴는 사용자의 명령을 받아들이는 가장 기본적인 장치며, 옵션 메뉴와 컨 텍스트 메뉴를 작성 및 출력하고 메뉴를 통해 프로그램의 현재 상태를 표시 지금까지 배운 내용을 총정리하며 개발 툴에 대한 고급 사용법을 익힌다. 내용 메 뉴 개발툴
3
1. 메 뉴 옵션 메뉴 안드로이드가 지원하는 메뉴는 세가지 종류가 있다.
옵션메뉴 : 주 메뉴. 최대 6개까지 가질 수 있으며 그 이상은 More 항목에 배치된다. 아이콘은 달 수 있지만 상태는 가지지 못한다. 컨텍스트 메뉴 : 화면을 일정한 시간 동안 누르고 있으면(Hold Down) 화면 중앙에 나타나며, 아이콘을 달 수 없지만 상태를 가진다. 서브 메뉴 : 메뉴 항목을 가지는 일종의 팝업이며 화면 한 가운데에 나타나며, 더 많은 항목을 넣고 싶을 때 옵션 메뉴나 컨텍스트 메뉴의 세부 메뉴로 작성한다.
4
1. 메 뉴 옵션 메뉴 액티비티의 다음 메서드에서 메뉴를 생성한다.
boolean onCreateOptionsMenu (Menu menu) 메뉴가 열릴 때 다음 메서드가 호출되며 여기서 메뉴의 상태를 관리한다. boolean onPrepareOptionsMenu (Menu menu) 메뉴가 선택될 때 다음 메서드가 호출되며 여기서 메뉴의 선택을 처리한다. boolean onOptionsItemSelected (MenuItem item)
5
1. 메 뉴 옵션 메뉴(실습예제) Input/OptionMenu.java case 2:
public class OptionMenu extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView MyText = new TextView(this); MyText.setText("메뉴 키를 누르세요."); setContentView(MyText); } public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); MenuItem item=menu.add(0,1,0,"짜장"); item.setIcon(R.drawable.icon); item.setAlphabeticShortcut('a'); menu.add(0,2,0,"짬뽕").setIcon(R.drawable.icon); SubMenu etc = menu.addSubMenu("기타"); etc.add(0,3,0,"우동"); etc.add(0,4,0,"만두"); return true; public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 1: Toast.makeText(this,"짜장은 달콤",Toast.LENGTH_ SHORT).show(); case 2: Toast.makeText(this,"짬뽕은 매워 ",Toast.LENGTH_SHORT).show(); return true; case 3: Toast.makeText(this,"우동은 시원해 case 4: Toast.makeText(this,"만두는 공짜야 } return false;
6
1. 메 뉴 XML로 메뉴 정의하기 메뉴는 프로그램의 동작을 정의라 하기보다는 일종의 디자인이므로 XML로 작성하는 것이 훨씬 더 쉽고 관리하기 좋다. Input/menu.xml <menu xmlns:android=" <item android:title="짜장" android:alphabeticShortcut="a" /> <item android:title="짬뽕" <item android:title="기타"> <menu> <item android:title="우동" <item android:title="만두" </menu> </item>
7
1. 메 뉴 XML로 메뉴 정의하기 Active 클래스의 getMenuInflater 메소드를 실행하여 MenuInflater 객체를 얻는다 MenuInflater 객체의 inflate 메소드를 실행하여 menu.xml 을 읽어들인다. Input/OptionMenu2.java public class OptionMenu extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView MyText = new TextView(this); MyText.setText("메뉴 키를 누르세요."); setContentView(MyText); } public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); return true; public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 1: Toast.makeText(this,"짜장은 달콤",Toast.LENGTH_ SHORT).show();
8
1. 메 뉴 체크 메뉴 항목 메뉴는 기본적으로 명령을 입력 받는 장치이지만 체크나 라디오 그룹 등을 통해 프로그 램의 현재 상태를 보여준다. checkableBehavior 속성으로 관리 방법 및 모양을 결정한다. checkableBehavior 속성 설 명 none 체크를 할 수 없는 단독 명령이다. all 모든 항목을 개별적으로 선택할 수 있으며 항목 옆에 네모난 체크 박스가 표시된다. single 그룹에 속한 항목중 하나만 배타적으로 선택할 수 있으며 항목 옆에 동그란 버튼이 표시된다.
9
1. 메 뉴 체크 메뉴 항목 (실습예제) <?xml version="1.0" encoding="utf-8"?>
Input/menucheck.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#ff0000" android:text="Button" android:textSize="20px" /> </LinearLayout>
10
1. 메 뉴 체크 메뉴 항목 (실습예제) menu/menucheck.xml <menu xmlns:android=" <item android:title="Sub Menu"> <menu> <group android:checkableBehavior="all"> <item android:title="BigFont" /> </group> <group android:checkableBehavior="single"> <item android:title="Red" android:checked="true" /> <item android:title="Green" /> <item android:title="Blue" /> </menu> </item>
11
1. 메 뉴 체크 메뉴 항목 (실습예제) Input/MenuCheak.java
public class MenuCheck extends Activity { Button mBtn; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.menucheck); mBtn = (Button)findViewById(R.id.button); } public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menucheck,menu); return true; public boolean onPrepareOptionsMenu(Menu menu) { if (mBtn.getTextSize() == 40) { menu.findItem(R.id.bigfont).setChecked(true); } else { menu.findItem(R.id.bigfont).setChecked(false); int color = mBtn.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); public boolean onOptionsItemSelected(MenuItem item) { 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); case R.id.green: mBtn.setTextColor(Color.GREEN); case R.id.blue: mBtn.setTextColor(Color.BLUE); return false;
12
1. 메 뉴 체크 메뉴 항목 (실습예제 결과)
13
1. 메 뉴 컨텍스트 메뉴 특정 뷰나 항목에 필요한 명령들만 모아 놓은 메뉴.
컨텍스트 메뉴를 달고 싶은 뷰는 다음 메서드로 등록한다. void Activity.registerForContextMenu (View view) 생성 및 선택 시 다음 메서드가 호출된다. void onCreateContextMenu (ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) 컨텍스트 메뉴의 항목을 선택하면 다음 메서드를 호출된다. boolean onContextItemSelected (MenuItem item) 뷰의 컨텍스트 메뉴를 생성할 때는 다음 메서드가 호출된다. void onCreateContextMenu (ContextMenu menu)
14
1. 메 뉴 컨텍스트 메뉴(실습예제) <?xml version="1.0" encoding="utf-8"?>
layout/contextmenu.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Button" /> <EditText android:text="EditText" <exam.Input.MyImage </LinearLayout>
15
1. 메 뉴 컨텍스트 메뉴(실습예제) Input/ContextMenu.java if (v == mEdit) {
public class ContextMenuTest extends Activity { Button mBtn; EditText mEdit; MyImage mImage; 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); case 3: mBtn.setTextColor(Color.BLUE); case 4: Toast.makeText(this,"번역했다.",Toast.LENGTH_SHORT).show(); case 5: Toast.makeText(this,"필기 인식했다.",Toast.LENGTH_SHORT).show(); case 100: Toast.makeText(this,"회전했다 치고.",Toast.LENGTH_SHORT).show(); case 101: Toast.makeText(this,"크기 변경 했다 치고.",Toast.LENGTH_SHORT).show();
16
1. 메 뉴 컨텍스트 메뉴(실습예제) 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,"크기 변경");
17
2. 개발툴 기억력 게임 안드로이드의 기본적인 문법 정리를 위한 실습 예제. Input/MemoryPower
// 액티비티 : 게임 뷰를 담는 껍데기. public class MemoryPower extends Activity { GameView gv; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); gv = new GameView(this); setContentView(gv); } //도형 하나에 대한 정보 class Shape { final static int RECT = 0; final static int CIRCLE = 1; final static int TRIANGLE = 2; int what; int color; Rect rt; // 게임 뷰 : 실질적인 메인이다. class GameView extends View { // 그리기 모드. 빈화면 또는 도형 출력 final static int BLANK = 0; final static int PLAY = 1; // 게임 진행 속도 final static int DELAY = 1500; // 현재 그리기 모드 int status; // 생성된 도형의 목록 ArrayList<Shape> arShape = new ArrayList<Shape>(); Random Rnd = new Random(); Activity mParent; public GameView(Context context) { super(context); mParent = (Activity)context; // 빈 화면으로 시작하고 잠시 후에 게임 시작 status = BLANK; mHandler.sendEmptyMessageDelayed(0,DELAY); } public void onDraw(Canvas canvas) { // 검정색 배경으로 지운다. 빈 화면이면 지우기만 하고 리턴 canvas.drawColor(Color.BLACK); if (status == BLANK) { return; // 도형 목록을 순회하면서 도형 정보대로 출력한다. int idx; for (idx = 0; idx < arShape.size(); idx ++) { Paint Pnt = new Paint(); Pnt.setColor(arShape.get(idx).color); Rect rt = arShape.get(idx).rt; switch (arShape.get(idx).what) { case Shape.RECT:
18
2. 개발툴 기억력 게임. canvas.drawRect(rt, Pnt); break; case Shape.CIRCLE:
canvas.drawCircle(rt.left + rt.width()/2, rt.top + rt.height()/2, rt.width()/2, Pnt); case Shape.TRIANGLE: Path path = new Path(); path.moveTo(rt.left + rt.width()/2, rt.top); path.lineTo(rt.left, rt.bottom); path.lineTo(rt.right, rt.bottom); canvas.drawPath(path, Pnt); } public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { int sel; sel = FindShapeIdx((int)event.getX(), (int)event.getY()); // 빈 바닥을 찍었으면 무시한다. if (sel == -1) { return true; // 마지막 추가된 도형을 제대로 찍었으면 다음 단계로 진행. // 빈 화면 잠시 보여준 후 새 도형 추가 if (sel == arShape.size()-1) { status = BLANK; invalidate(); mHandler.sendEmptyMessageDelayed(0,DELAY); // 엉뚱한 도형을 찍었으면 질문 후 게임 종료 또는 재시작 } else { new AlertDialog.Builder(getContext()) .setMessage("재미있지! 또 할래?") .setTitle("게임 끝") .setPositiveButton("함더",new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { arShape.clear(); status = BLANK; invalidate(); } }) .setNegativeButton("안해",new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { mParent.finish(); .show(); return true; return false;
19
2. 개발툴 기억력 게임. void AddNewShape() { Shape shape = new Shape();
// 새로운 도형을 목록에 추가한다. void AddNewShape() { Shape shape = new Shape(); int idx; boolean bFindIntersect; Rect rt = new Rect(); // 기존 도형과 겹치지 않는 새 위치를 찾는다. for (;;) { // 크기는 32, 48, 64 중 하나 선택 int Size = * Rnd.nextInt(3); // 위치는 난수로 선택 rt.left = Rnd.nextInt(getWidth()); rt.top = Rnd.nextInt(getHeight()); rt.right = rt.left + Size; rt.bottom = rt.top + Size; // 화면을 벗어나면 안된다. if (rt.right > getWidth() || rt.bottom > getHeight()) { continue; } // 기존 도형 순회하며 겹치는지 조사한다. bFindIntersect = false; for (idx = 0; idx < arShape.size(); idx ++) { if (rt.intersect(arShape.get(idx).rt) == true) { bFindIntersect = true; // 겹치지 않을 때 확정한다. 겹치면 계속 새 위치 선정한다. if (bFindIntersect == false) { break; // 새 도형 정보 작성. 모양, 색상 등을 난수 선택한다. shape.what = Rnd.nextInt(3); switch (Rnd.nextInt(5)) { case 0: shape.color = Color.WHITE; break; case 1: shape.color = Color.RED; case 2: shape.color = Color.GREEN; case 3: shape.color = Color.BLUE; case 4: shape.color = Color.YELLOW; } shape.rt = rt; arShape.add(shape); // x, y 위치의 도형 번호를 찾는다. 도형이 없는 위치면 -1 리턴 int FindShapeIdx(int x, int y) { int idx;
20
2. 개발툴 기억력 게임. for (idx = 0; idx < arShape.size(); idx ++) {
if (arShape.get(idx).rt.contains(x, y)) { return idx; } return -1; // 새 도형을 추가하고 화면을 다시 그린다. 시간 딜레이를 주기 위해 핸들러를 사용했다. Handler mHandler = new Handler() { public void handleMessage(Message msg) { AddNewShape(); status = PLAY; invalidate(); String title; title = "MemoryPower - " + arShape.size() + " 단계"; mParent.setTitle(title); };
21
2. 개발툴 디버깅 디버깅 하기 위해서는 매니페스트에 다음 플래그를 지정한다.
<application android:debuggable="true"> 매니페스트에 debuggable 속성을 켜야 사용할 수 있다. Ctrl + Shift + B를 누르면 중단점이 설정되며, 다시한번 설정하면 중단점이 토글된다. 디버깅을 위해 Debug 퍼스펙티브로 전환하겠다는 것을 알리는 메시지 (퍼스펙티브 : 뷰의 집합)
22
2. 개발툴 디버깅 메시지에 Yes 응답 후 Remember my decision 옵션 선택하면 다은부터 퍼스펙티브를 자 동으로 전환하며, 다음과 같이 개발 환경의 뷰가 완전히 재배치 된다.
23
2. 개발툴 디버깅 메뉴에서 디버깅 관련 명령어 단축키.
F6키를 눌러 indShapeIdx 메서드 호출문까지 실행 후 F5를 눌러 메서드 안쪽까지 추적 해 들어가보면 다음 그림과 같다. 단축키 설 명 F5 메서드 안으로 추적해 들어간다. F6 다음 명령문을 실행한다. F7 메서드의 끝까지 실행하고 리턴한다. F8 다음 중단점까지 실행한다. Ctrl + R 커서가 있는 지점까지 실행한다. Ctrl + F2 디버깅을 중단한다.
24
2. 개발툴 DDMS DDMS(Dalvik Debug Monitor Service)는 ADT와 함께 설치되는 플러그인이며 여러 가지 기능을 제공하는 디버깅 툴이다. 포드 포워딩, 화면 캡쳐, 스레드 및 힙 상태 보기, 장비의 파일 관리, 디버그 로그 보기, 통화 및 문자 메시지 에뮬레이션 등 포함
25
2. 개발툴 DDMS Png파일로 저장 가능 Input 현재 스테드 상태 예제
26
2. 개발툴 로 그 로그는 시스템이나 응용 프로그램의 동작에 대한 상세한 기록이다.
시스템은 장비에서 발생하는 문제점 로그를 남기며, 응용 프로그램은 디버깅이나 경고, 실행 흐름 추적 등을 위해 수시로 로그를 남긴다. 로그는 디버깅에 비해 항상 출력되는 실시간으로 프로그램의 상태를 출력한다는 점에서 유용하다. 로그를 출력할 때는 다음과 같은 메서를 사용한다. static int Log.d (String tag, String msg [, Throwable tr]) static int Log.e(String tag, String msg [, Throwable tr]) static int Log.w(String tag, String msg [, Throwable tr]) static int Log.i(String tag, String msg [, Throwable tr]) static int Log.v(String tag, String msg [, Throwable tr])
27
2. 개발툴 로 그(실습예제) 버튼을 클릭하면 로그를 남기게 된다. Input/LogTest.java
public class LogTest extends Activity { private static final String TAG = "LogTest"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.logtest); Log.v(TAG,"onCreate"); findViewById(R.id.btn1).setOnClickListener(mClickListener); findViewById(R.id.btn2).setOnClickListener(mClickListener); } public void onDestroy() { super.onDestroy(); Log.v(TAG,"onDestroy"); Button.OnClickListener mClickListener = new Button.OnClickListener() { public void onClick(View v) { MediaPlayer player; switch (v.getId()) { case R.id.btn1: Log.v(TAG,"First Button Pressed"); break; case R.id.btn2: Log.v(TAG,"Second Button Pressed"); }; 버튼을 클릭하면 로그를 남기게 된다.
28
2. 개발툴 로 그(실습예제)
29
2. 개발툴 adb adb(Android Debug Bridge) : 명령행에서 장비의 상태를 관리하는 툴이다.
adb기능이 대부분이 DDMS에서도 사용이 가능하므로 자주 사용하지 않는다. adb는 다음 3가지 요소가 협력적으로 동작하여 개발 컴퓨터와 장비간 통신 수행한다. 클라이언트 : 개발 컴퓨터에서 실행되는 관리 툴, adb자체가 대표적이며 이 외에 ADT플러그인이 나 DDMS도 클라이언트로 동작 서버 : 개발 컴퓨터에서 백그라운드로 실행되며 클라이언트와 데몬을 중계하는 역할을 한다. 데몬 : 장비에서 백그라운드로 동작하며 클라이언트로부터 전달된 명령을 장비에서 수행한다. 연결 장비가 여러 개이면 어떤 장비에 대해 명령을 수행할 것인지를 지정해야 하는데 이때는 다음 세 개의 플래그 중 하나를 사용한다. 플래그 설 명 -d 실장비에 대해 명령을 수행한다. 실장비가 두 개 이상 연결되어 있으면 에러 처리된다. -e 에뮬레이터에 대해 명령을 수행한다. 에뮬레이터가 두 개 이상 연결되어 있으면 에러 처리된다. -s 일련번호 명령을 수행할 장비의 일련번호를 지정한다. 해당 일련번호의 장비가 존재하지 않으면 에러 처리된다.
Similar presentations