과목명 : 모바일 프로그래밍(Mobile programming with Android Studio)
수업일자 : 2023년 04월 14일 (금)
1. 안드로이드 메뉴(Menu) 위젯 - 옵션 메뉴(Option Menu)
(1) 안드로이드에서의 메뉴(Menu)는, 사용자가 여러 개의 선택지 중 하나를 선택하여 사용자의 명령을 받아들이는 위젯을 의미합니다.
- 메뉴의 종류로는 옵션 메뉴(Option menu), 컨텍스트 메뉴(Context menu)가 존재합니다.
1-1. 옵션 메뉴(Option menu)
(1) 옵션 메뉴란, 키패드의 메뉴 버튼을 눌렀을 때 일반적으로 화면 하단에 표시되는 메뉴입니다.
(2) 사용자가 선택할 수 있는 메뉴들이 표시되며 화면을 초과할 경우 스크롤로 조정함으로써 처리할 수 있습니다.
1-2. XML를 이용한 옵션 메뉴 - 메뉴 XML 파일을 이용한 방식
- (1) → (2) → (3) 순으로 진행합니다.
(1) Menu 폴더 생성 및 Menu XML 파일 생성 및 편집
- Menu 부분 코딩
(2) Java 코딩 : onCreateOptionsMenu() 메소드 오버라이딩
- Menu 파일 등록
(3) Java 코딩 : onOptionsItemSelected() 메소드 오버라이딩
- Menu 선택 시 동작할 내용 코딩
1-3. 메뉴 XML 파일 형식
1-4. 메뉴의 onCreateOptionsMenu() 메소드의 기본 형식
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater mInflater = getMenuInflater();
mInflater.inflate(R.menu.메뉴 XML ID, menu);
return true;
}
1-5. 메뉴의 onOptionsItemSelected() 메소드의 기본 형식
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.항목 1 ID:
// 항목 1을 선택했을 때 수행할 코드
return true;
case R.id.항목 2 ID:
// 항목 2를 선택했을 때 수행할 코드
return true;
}
return false;
}
1-6. 예제 : 배경 색을 전환하는 Application Code
(1) XML Code - 기본 Setting
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
android:id="@+id/baseLayout">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="오른쪽 위 메뉴 버튼을 누르세요" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="Button1" />
</LinearLayout>
< 위젯 배치 결과>
(2) 옵션 메뉴 디렉토리 생성 및 메뉴 파일에 대한 XML 파일 생성하기
- 프로젝트 경로에서 app/res 디렉토리를 찾고, 마우스 오른쪽 버튼 클릭합니다.
- New → Android Resource Directory 선택합니다.
- new Resource Directory 메뉴에서 Resource type을 "menu"로 선택, File name까지 지정해 준 후 최종적으로 OK 버튼을 클릭합니다.
- 이후 menu 디렉토리를 기준으로 menu1.xml 파일을 생성합니다.
(2) 메뉴 XML 파일 - 화면 디자인 및 편집
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/itemRed"
android:title="배경색(RED)">
</item>
<item
android:id="@+id/itemGreen"
android:title="배경색(Green)">
</item>
<item
android:id="@+id/itemBlue"
android:title="배경색(Blue)">
</item>
<item
android:title="메뉴 변경" >
<menu>
<item
android:id="@+id/subRotate"
android:title="버튼 45도 회전"/>
<item
android:id="@+id/subSize"
android:title="버튼 2배 확대"/>
</menu>
</item>
</menu>
<위젯 배치 결과>
(3) Java 코드 작성 및 수정 - MainActivity.java
- activity_main.xml 파일에 존재하는 레이아웃, 버튼에 대응되는 전역 변수 2개를 선언합니다.
- MainActivity.java 내부의 onCreate() 메소드 내부에서 위젯 변수 2개에 위젯을 대입합니다.
package com.example.a7weekstest3;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
LinearLayout baseLayout;
Button button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("배경색 전환하기");
baseLayout = (LinearLayout) findViewById(R.id.baseLayout);
button1 = (Button) findViewById(R.id.button1);
}
}
(4) 앞서 설명된 onCreateOptionsMenu() 메소드를 오버라이딩해야 합니다.
- onCreateOptionsMenu() 메소드를 Activity 클래스로부터 오버라이딩합니다.
- Windows OS 단축키 : Ctrl + O (Method overriding)
- Android Studio 기준 실행 경로 : Code → Override Methods... Ctrl + O
- 현재 해당 페이지를 보시면 상당히 많은 메소드의 리스트가 출력됩니다. 여기서 Ctrl + F 단축키를 통해 오버라이딩하고자 하는 메소드를 빠르게 탐색할 수 있습니다.
- Ctrl + F 키를 눌러서 onCreateOptionsMenu() 메소드를 빠르게 찾습니다.
(4) 메뉴를 클릭했을 때 실제 동작이 이루어질 onOptionsItemSelected() 메소드를 위와 같이 오버라이딩 한 후, 동작을 위한 Java 코드를 작성합니다.
package com.example.a7weekstest3;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
LinearLayout baseLayout;
Button button1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("배경색 전환하기");
baseLayout = (LinearLayout) findViewById(R.id.baseLayout);
button1 = (Button) findViewById(R.id.button1);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater mInflater = getMenuInflater();
mInflater.inflate(R.menu.menu1, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.itemRed:
baseLayout.setBackgroundColor(Color.RED);
return true;
case R.id.itemGreen:
baseLayout.setBackgroundColor(Color.GREEN);
return true;
case R.id.itemBlue:
baseLayout.setBackgroundColor(Color.BLUE);
return true;
case R.id.subRotate:
button1.setRotation(45);
return true;
case R.id.subSize:
button1.setScaleX(2);
}
return false;
}
}
<실행 결과>
- 애플리케이션 우측 상단의 메뉴를 클릭해서 메뉴를 노출시킵니다.
- 각각의 버튼을 클릭했을 때 화면의 전체적인 레이아웃 색상이 변경되는 것을 확인할 수 있습니다.
- 초기 옵션 메뉴에서 하단의 "메뉴 변경"을 선택했을 때 또 다른 옵션 메뉴가 출력됩니다. (버튼 45도 회전, 버튼 2배 확대)
- 마찬가지로 각각의 버튼을 누름으로써 기존 Button의 변화가 일어나는 것을 확인할 수 있습니다.
1-7. 예제 : 배경 색을 전환하는 Application Code (2)
- XML 파일 없이, onCreateOptionsMenu() 메소드 내부에서 메뉴 XML 파일에 직접 접근하는 대신에 menu.add() 메소드로 메뉴 항목을 추가할 수 있습니다.
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 1, 0, "배경색(RED)");
menu.add(0, 2, 0, "배경색(Green)");
menu.add(0, 3, 0, "배경색(Blue)");
SubMenu sMenu = menu.addSubMenu("버튼 변경 >>");
sMenu.add(0, 4, 0, "버튼 45도 회전");
sMenu.add(0, 5, 0, "버튼 2배 확대");
return true;
}
2. 안드로이드 메뉴(Menu) 위젯 - 컨텍스트 메뉴(Context Menu)
2-1. 컨텍스트 메뉴(Context menu)
(1) 레이아웃 또는 버튼, EditText 등의 위젯을 롱클릭하면 나타나는 컨텍스트 메뉴입니다. (Windows의 팝업창과 비슷합니다.)
(1) 컨텍스트 메뉴란, 화면을 오래 누르고 있는 동작 등으로 화면 중앙에 표시되는 메뉴 위젯을 의미합니다.
(2) 일반적으로 보통 메뉴창 맨 위에 제목을 표시하고 그 아래에 메뉴가 표시됩니다.
2-2. 컨텍스트 메뉴 설정 순서
(1) 메뉴 폴더를 생성하고 위젯의 메뉴 XML 파일을 생성 및 편집합니다
- Menu 코딩
(2) MainActivity.java : onCreate() 메인 메소드 내부에 registerForContextMenu() 메소드를 등록합니다.
- 메뉴를 사용할 위젯을 등록
(3) MainActivity.java : onCreateContextMenu() 메소드를 오버라이딩합니다.
- 메뉴 파일을 등록
(4) MainActivity.java : onContextItemSelected() 메소드 오버라이딩합니다.
- 메뉴 선택 시 동작할 내용을 코딩
2-3. 컨텍스트 메뉴의 XML 파일
(1) 컨텍스트 메뉴가 노출되게 할 위젯마다 별도의 XML 파일을 생성해야 합니다.
(2) 메뉴 XML 파일의 문법은 옵션 메뉴와 동일합니다.
(3) onCreateContextMenu() 메소드에는 위젯별로 컨텍스트 메뉴가 노출되어야 하므로 위젯별 컨텍스트 메뉴를 조건문인 if문을 사용해서 등록합니다.
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater mInflater = getMenuInflater();
if (v == 위젯 1) {
mInflater.inflate(R.menu.첫 번째 메뉴 XML 파일, menu);
}
if (v == 위젯 2) {
mInflater.inflate(R.menu.두 번째 메뉴 XML 파일, menu);
}
}
2-4. 예제 : 배경색 변경 및 버튼 형태 변경 Application Code
(1) 화면 디자인 및 편집 - 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"
tools:context=".MainActivity"
android:gravity="center_horizontal">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="배경색 변경" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="버튼 변경" />
</LinearLayout>
<위젯 배치 결과>
(2) menu 디렉토리를 생성하고 해당 디렉토리에 menu1.xml, menu2.xml 파일을 생성합니다.
- menu1.xml : 배경색 변경과 관련된 3개 항목 생성
- menu2.xml : 버튼 변경과 관련된 2개 항목 생성
- menu1.xml XML Code
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/itemRed"
android:title="배경색(RED)">
</item>
<item
android:id="@+id/itemGreen"
android:title="배경색(GREEN)" >
</item>
<item
android:id="@+id/itemBlue"
android:title="배경색(BLUE)" >
</item>
</menu>
<위젯 배치 결과>
- menu2.xml XML Code
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/subRotate"
android:title="버튼 45도 회전" >
</item>
<item
android:id="@+id/subSize"
android:title="버튼 2배 확대" >
</item>
</menu>
<위젯 배치 결과>
(3) MainActivity.java Code
- activity_main.xml 레이아웃과 버튼 2개에 대응할 전역 변수 3개
- onCreate() 메소드 내부에서 위젯 변수 3개에 위젯을 대입
- 2개의 버튼 위젯 변수를 registerForContextMenu() 메소드 내부에 등록
- 선텍한 위젯에 따라 인플레이트하는 메뉴 XML 파일을 다르게 설정
- onCreateContextMenu() 메소드를 오버라이딩 하여 코드 작성
package com.example.a7weekstest4;
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.LinearLayout;
public class MainActivity extends AppCompatActivity {
LinearLayout baseLayout;
Button button1, button2;
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
// TODO Auto-generated method stub
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater mInflater = getMenuInflater();
if (v == button1) {
menu.setHeaderTitle("배경색 변경");
mInflater.inflate(R.menu.menu1, menu);
}
if (v == button2) {
mInflater.inflate(R.menu.menu2, menu);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("배경색 전환(Context menu)");
baseLayout = (LinearLayout) findViewById(R.id.baseLayout);
button1 = (Button) findViewById(R.id.button1);
registerForContextMenu(button1);
button2 = (Button) findViewById(R.id.button2);
registerForContextMenu(button2);
}
}
<실행 결과>
3. 안드로이드 Toast 위젯
3-1. Toast
(1) 토스트는 화면에 잠깐 표시되었다 사라지는 메시지를 의미합니다.
(2) 개발자가 디버깅 용도로도 사용 가능합니다.
3-2. Toast의 일반적인 형태
(1) 매개변수 duration의 경우 토스트 메시지가 출력되는 시간입니다.
Toast.makeText(Context context, String message, int duration).show();
(2) setGravity() 메소드를 사용하면 토스트 메시지의 위치를 변경할 수 있습니다.
- 매개변수 gravity : 화면의 위, 중앙, 아래 등을 지정
- 매개변수 xOffset, yOffset : 떨어진 거리
Toast.setGravity(int gravity, int xOffset, int yOffset);
3-3. Toast 메시지가 랜덤한 위치에 출력되도록 하는 예제 Code
(1) 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"
tools:context=".MainActivity"
android:gravity="center_horizontal">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Toast 메시지 출력" />
</LinearLayout>
(2) MainActivity.java
package com.example.toasttest;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("Toast Message");
final Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Toast tMsg = Toast.makeText(MainActivity.this, "Toast Message", Toast.LENGTH_SHORT);
Display display = ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
int xOffset = (int) (Math.random() * display.getWidth());
int yOffset = (int) (Math.random() * display.getHeight());
tMsg.setGravity(Gravity.TOP | Gravity.LEFT, xOffset, yOffset);
tMsg.show();
}
});
}
}
<실행 결과>
- Toast Message가 랜덤한 위치에서 버튼을 클릭할 때마다 생성됩니다.
4. 안드로이드 기본 대화 상자(Dialog)
4-1. 기본 대화 상자(Dialog)
(1) 대화 상자는 사용자에게 중요한 사항을 알려준 후, 어떤 선택을 하게 하는 것이 목적인 위젯입니다.
4-2. 대화 상자(Dialog)
(1) 대화 상자 생성
- AlertDialog.Builder 클래스로 생성합니다.
(2) 용도에 따른 설정
- setTitle() : 제목 설정
- setMessage() : 내용 입력
- setIcon() : 아이콘 설정
- setPositiveButton() : <OK> 버튼
- setNegativeButton() : <Cancel> 버튼
- setItems() : 목록 출력
- setSingleChoiceItems() : Radio 버튼 목록 출력
- setMultiChoiceItems() : CheckBox 목록 출력
(3) 대화 상자 화면 출력
- show()
4-3. 대화 상자 예제 Code (1)
(1) 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"
tools:context=".MainActivity"
android:gravity="center_horizontal">
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="대화 상자(Dialog)" />
</LinearLayout>
(2) MainActivity.java
package com.example.dialogtest;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("Dialog 제목입니다.");
dlg.setMessage("Dialog 내용입니다.");
dlg.setIcon(R.mipmap.ic_launcher);
dlg.setPositiveButton("OK", null);
dlg.setNegativeButton("Cancel", null);
dlg.show();
}
});
}
}
<실행 결과>
4-4. 대화 상자 예제 Code (2) - 버튼 클릭 시 동작하는 대화 상자
(1) setPositiveButton("문자열", Listener);
- Listener가 null이라 현재 어떠한 동작도 하지 않으므로 해당 부분을 수정합니다.
- Listener 영역에 DialogInterface.OnClickListener()를 매개변수로 설정합니다.
dlg.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(MainActivity.this, "OK 버튼을 눌렀습니다", Toast.LENGTH_SHORT).show();
}
});
<실행 결과>
4-5. 대화 상자 예제 Code (3) - 기본적인 목록을 만드는 형식
- 상수 타입의 배열을 선언하고 옵션값을 할당한 뒤, 목록을 출력하는 setItems() 메소드의 전달 인자로 배열명을 넘겨서 배열에 할당했던 옵션들이 노출되도록 설정합니다.
package com.example.dialogtest;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
final String[] versionArray = new String[] {"Q(10)", "R(11)", "S(12)"};
AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("Version 선택");
dlg.setIcon(R.mipmap.ic_launcher);
dlg.setItems(versionArray, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
button1.setText(versionArray[which]);
}
});
dlg.setPositiveButton("닫기", null);
dlg.show();
}
});
}
}
<실행 결과>
4-6. 대화 상자 예제 Code (4) - 기본적인 목록을 만드는 형식 (Radio 버튼 목록 대화상자)
(1) setItems() 메소드 대신, setSingleChoiceItems() 메소드를 사용하면 라디오 버튼 형식으로 목록이 출력됩니다.
(2) setSingleChoiceItems(문자열 배열명, 배열의 초기 인덱스, Listener) 메소드 형식으로 메소드의 파라미터가 총 3개입니다.
dlg.setSingleChoiceItems(versionArray, 0, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
button1.setText(versionArray[which]);
}
});
<실행 결과>
4-7. 대화 상자 예제 Code (5) - 기본적인 목록을 만드는 형식 (CheckBox 목록 대화상자)
(1) 체크박스 목록 형태의 대화 상자를 생성하려면, setMultiChoiceItems() 메소드를 사용합니다.
(2) setMultiChoiceItems() 메소드의 3번 째 파라미터로 사용되는 Listener의 타입은 DialogInterface.OnMultiChoiceClickListener()입니다.
dlg.setMultiChoiceItems(versionArray, checkArray, new DialogInterface.OnMultiChoiceClickListener() {
(3) 체크 박스의 초기값(체크 여부)을 결정하기 위해 OnClick() 메소드 내부에 Boolean 타입의 checkArray 배열을 생성합니다.
- setMultiChoiceItems() 메소드 내부 onClick() 메소드의 3번 째 파라미터로 checkArray 배열을 위한 boolean 타입의 데이터를 매개변수로 받도록 합니다.
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
final String[] versionArray = new String[] {"Q(10)", "R(11)", "S(12)"};
final boolean[] checkArray = new boolean[] {false, false, false};
AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("Version 선택");
dlg.setIcon(R.mipmap.ic_launcher);
dlg.setMultiChoiceItems(versionArray, checkArray, new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which, boolean isChecked) {
button1.setText(versionArray[which]);
}
});
dlg.setPositiveButton("닫기", null);
dlg.show();
}
});
<실행 결과>
4-8. 예제 : 사용자의 정보를 입력받는 Application Code
(1) 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:gravity="center_horizontal"
tools:context=".MainActivity">
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="사용자 이름"/>
<TextView
android:id="@+id/tvEmail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="사용자 E-mail"/>
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click here" />
</LinearLayout>
<위젯 배치 결과>
(2) 대화 상자에서 사용할 레이아웃을 편집합니다.
- 프로젝트 디렉토리 경로 app / res / layout에서 마우스 오른쪽 클릭 → New → Layout Resource File 클릭
- New Resource File 창에서 File name → dialog1, Root element → LinearLayout를 선택합니다.
(3) 대화 상자 dialog1.xml 파일
- TextView, EditText, TextView, EditText 순서대로 위젯을 생성합니다.
- EditText 위젯의 아이디를 각각 dlgEdt1, dlgEdt2로 설정합니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="사용자 이름"
android:textSize="20dp"/>
<EditText
android:id="@+id/dlgEdt1"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="사용자 E-mail"
android:textSize="20dp"/>
<EditText
android:id="@+id/dlgEdt2"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
<위젯 배치 결과>
(4) layout 디렉토리에 toast1.xml 파일을 생성합니다.
- ImageView, TextView, ImageView 순서대로 위젯을 생성합니다.
- TextView의 ID 값을 "toastText1"로 설정하고 레이아웃의 Background 색상을 "#ff0000"으로 설정합니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ff0000"
android:gravity="center">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/skullicon1220" />
<TextView
android:id="@+id/toastText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:text="TextView"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/skullicon1220" />
</LinearLayout>
<위젯 배치 결과>
(4) MainActivity.java
- activity_main.xml 파일의 TextView 2개, Button 1개에 대응할 전역 변수 3개 생성
- dialog1.xml 파일의 EditText에 대응할 전역 변수 2개 생성
- toast1.xml 파일의 TextView 1개에 대응할 전역 변수 1개 생성
- dialog1.xml, toast1.xml을 Inflate할 View 변수 2개 생성
- onCreate() 메인 메소드 내부에서 activity_main.xml 파일의 위젯 변수 3개에 위젯을 대입
- button1 변수를 클릭했을 때 Listener를 작성합니다
- onClick() 메소드 내부에 대화 상자를 생성하고 <확인>, <취소>를 추가합니다
- 대화 상자의 <확인>을 클릭하면 대화 상자에서 입력된 사용자 정보가 activity_main.xml 파일의 TextView 위젯에도 나타날 수 있도록 설정합니다.
- 대화 상자의 <취소>를 클릭하면 toast1.xml 파일의 내용이 Toast 메시지로 출력될 수 있도록 설정합니다.
- 위의 내용이 모두 반영된 MainActivity.java Code는 다음과 같습니다.
package com.example.app2userinfo;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
TextView tvName, tvEmail;
Button button1;
EditText dlgEdtName, dlgEdtEmail;
TextView toastText;
View dialogView, toastView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setTitle("사용자 정보 입력 App");
tvName = (TextView) findViewById(R.id.tvName);
tvEmail = (TextView) findViewById(R.id.tvEmail);
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
dialogView = (View) View.inflate(MainActivity.this, R.layout.dialog1, null);
AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("사용자 정보 입력");
dlg.setIcon(R.drawable.skullicon1220);
dlg.setView(dialogView);
dlg.setPositiveButton("확인", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
dlgEdtName = (EditText) dialogView.findViewById(R.id.dlgEdt1);
dlgEdtEmail = (EditText) dialogView.findViewById(R.id.dlgEdt2);
tvName.setText(dlgEdtName.getText().toString());
tvEmail.setText(dlgEdtEmail.getText().toString());
}
});
dlg.setNegativeButton("취소", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int which) {
Toast toast = new Toast(MainActivity.this);
toastView = (View) View.inflate(MainActivity.this, R.layout.toast1, null);
toastText = (TextView) toastView.findViewById(R.id.toastText1);
toastText.setText("취소되었습니다.");
toast.setView(toastView);
toast.show();
}
});
dlg.show();
}
});
}
}
<실행 결과>
- 초기 실행 화면입니다.
- CLICK HERE 버튼을 클릭했을 때 사용자의 정보를 입력할 수 있는 Dialog가 나타납니다.
- 사용자 정보를 입력할 수 있습니다.
- 확인 버튼을 누르면 입력한 정보가 화면에 출력됩니다.
- 만약 취소 버튼을 클릭하면 설정한 Toast message가 출력되며 정보 입력 대화 상자가 종료됩니다.
5. Etc
5-1. XML Tag 관련
(1) CheckBox를 생성하는 XML 태그 : CheckBox
(2) RadioButton을 생성하는 XML 태그 : RadioButton
(3) Rating Bar에서 별의 개수를 지정하는 XML 속성 : numStars
5-2. Layout의 5가지 종류
(1) LinearLayout
(2) RelativeLayout
(3) TableLayout
(4) GridLayout
(5) FrameLayout
5-3. EditText의 입력값 추출, 이미지를 사용하기 위한 디렉토리
(1) EditText의 입력값을 가져오는 Java 코드는 아래와 같습니다.
- String myStr = myEdit.getText().toString();
String myStr = myEdit.getText().toString();
(2) 이미지를 사용하려면 해당 이미지 파일을 res > drawable 폴더(디렉토리)에 미리 복사합니다.
(3) LinearLayout의 주요 속성 5가지
- Orientation, gravity, padding, layout_weight, baselineAligned
5-4. Button의 Java 코드
- Button의 Java 코드는 다음과 같이 세 단계를 거쳐서 작성하게 됩니다.
// 1. 버튼 변수 선언
Button myButton;
// 2. 변수에 버튼 위젯 대입
myButton = (Button) findViewById(R.id.button1);
// 3. 버튼을 클릭할 때 동작하는 클래스 정의
myButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) { // 동작 기능 }
});
// 1. Button 변수 선언
Button myButton;
// 2. 변수에 버튼 위젯 대입
myButton = (Button) findViewById(R.id.button1);
// 3. 버튼을 클릭할 때 동작하는 클래스 정의
myButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) { /* 동작 기능 */ }
});
5-5. 메소드 오버라이딩 메뉴, Option menu, Context menu 차이
- 부모 클래스의 메소드를 자동으로 오버라이딩하려면 클래스 내부에 커서를 두고 Android Studio 메뉴의 Code → Override Methods를 선택합니다.
- Option 메뉴는 키패드의 메뉴 버튼을 클릭하면 화면 하단에 노출되고, Context 메뉴는 위젯을 롱클릭하면 나옵니다.
5-6. 시간 및 날짜와 관련된 위젯
(1) AnalogClock
(2) DigitalClock
(3) Chronometer
(4) TimePicker
(5) DatePicker
(6) CalandarView
5-7. Chronometer 위젯 관련
- 크로노미터(Chronometer) 초기화는 setBase(), 시작은 start(), 중지는 stop() 메소드를 사용합니다.
- 위젯이 많아서 화면에 넘칠 때 ScrollView 위젯에 넣으면 세로 스크롤 효과를 낼 수 있고 HorizontalScrollView 위젯에 넣으면 가로 스크롤 효과를 낼 수 있습니다.
5-8. Toast의 사용 형식, Menu XML
- 토스트(Toast)의 가장 일반적인 사용 형식은 다음과 같습니다.
Toast.makeText(Context context, String message, int duration).show();
Toast.makeText(Context context, String message, int duration).show();
- 메뉴 XML 파일의 형식은 다음과 같습니다.
<menu>
<item
android:id="@+id/항목 1 아이디"
android:title="항목 1 제목"/>
<item
<!-- 내용 생략 -->
</menu>
<menu>
<item
android:id="@+id/항목 1 아이디"
android:title="항목 1 제목"/>
<item
<!-- 내용 생략 -->
</menu>
6. Reference
(1) Reference
- Android Studio를 활용한 안드로이드 프로그래밍 / 한빛아카데미(Hanbit Academy, Inc.)
(2) URL
https://www.hanbit.co.kr/store/books/look.php?p_code=B1212492850
- 학부에서 수강했던 전공 수업 내용을 정리하는 포스팅입니다.
- 내용 중에서 오타 또는 잘못된 내용이 있을 시 지적해 주시기 바랍니다.
댓글