- Android UI
- 용어 정의
- 화면 크기
- Resource
- 화면 회전
- View
- Droid Draw
- Android의 화면 구성 요소
- Focus
- Event
- android.widget
- TextView
- EditText
- Button
- ListView
- Spinner
- Notification, Alarm
- Toast
- Notification
- AlarmManager
- Dialog
- Single choice list
- ProgressDialog
- 디자인 가이드
- 참고 문헌
스마트폰 OS인 Android에서 UI 관련 사항을 정리 한다.
Android UI
용어 정의
{|cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center"
|-
|width="20%" align="center" valign="middle" style="color:#15470a; background-color:#91ce5c;"|density
|width="80%"|
밀도 (density)
물리적인 길이 안에 포함된 픽셀(px)의 수
dpi : density per inch
QVGA : 120 dpi, HTC Tatii
HVGA : 160 dpi, 안드로원, HTC G1
WVGA : 240 dpi, 넥서스원, 갤럭시A, 갤럭시S, 베가, 시리우스, 이자르
FWVGA : 240 dpi, 모토로이, 드로이드
Google Android에서의 dpi
ldpi : Low density, 120 dpi
mdpi : Midium density, 160 dpi
hdpi : High density, 240 dpi (이미지 작성시 기준) align="center" valign="middle" style="color:#15470a; background-color:#91ce5c;"
Density-independent pixel
160 pixels을 기본 밀도(160 dip)로 하여 작성된 밀도에 독립적인 가상의 단위
pixels = dips * (density / 160)
dips = pixels * 160 / density
density로는 Android의 dpi를 사용할 것 align="center" valign="middle" style="color:#15470a; background-color:#91ce5c;"
해상도, 화면의 전체 픽셀 수
예) 240 * 320
|}
화면 크기
화면 크기 및 화면 방향 구하기
Display display = null;
DisplayMetrics displayMetrics = null;
int dipWidth = 0;
int dipHeight = 0;
int orientation = 0;
displayMetrics = new DisplayMetrics();
display = getWindowManager().getDefaultDisplay();
display.getMetrics(displayMetrics);
//--- displayMetrics.density : density / 160, 0.75 (ldpi), 1.0 (mdpi), 1.5 (hdpi)
dipWidth = (int)(displayMetrics.widthPixels / displayMetrics.density);
dipHeight = (int)(displayMetrics.heightPixels / displayMetrics.density);
//--- 0. 세로, 1. 가로
orientation = display.getOrientation();
Activity에서 화면 크기 구하는 방법
StringBuffer buf = null;
WindowManager wm = null;
Display display = null;
DisplayMetrics metrics = null;
wm = getWindowManager();
display = wm.getDefaultDisplay();
metrics = new DisplayMetrics();
display.getMetrics(metrics);
buf = new StringBuffer();
buf.append("Window display id: " + display.getDisplayId() + "\n");
buf.append("Window orientation: " + display.getOrientation() + "\n");
buf.append("Window width: " + display.getWidth() + "\n");
buf.append("Window height: " + display.getHeight() + "\n");
buf.append("Window pixel format: " + display.getPixelFormat() + "\n");
buf.append("Window refresh rate: " + display.getRefreshRate() + "\n");
buf.append("Window width pixels: " + metrics.widthPixels + "\n");
buf.append("Window height pixels: " + metrics.heightPixels + "\n");
testMsg.setText(buf.toString());
갤럭시S의 화면 크기
세로 화면 크기
:Window display id: 0
:Window orientation: 0
:Window width: 320
:Window height: 533 :Window pixel format: 5 :Window refresh rate: 68.0 :Window width pixels: 320 :Window height pixels: 533가로 화면 크기
:Window display id: 0
:Window orientation: 1
:Window width: 533
:Window height: 320 :Window pixel format: 5 :Window refresh rate: 68.0 :Window width pixels: 533 :Window height pixels: 320
Resource
/res/layout/
layout-small, layout-large
/res/drawable/
drawable-ldpi, drawable-mdpi, drawable-hdpi, drawable-nodpi
Dimensions
/res/values/dimensions.xml
10dip
int size = getResources().getDimensionPixelSize(R.dimen.length);
화면 회전
Resource에서 화면(layout) 정의
세로 화면 : /res/layout-port/~.xml
가로 화면 : /res/layout-land/~.xml
회전 상태 확인
Android 2.1
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
//--- orientation : 0. 세로, 1. 가로
int orientation = display.getOrientation();
Android 2.2
WindowManager wm = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
//--- Surface.ROTATION_0 : 세로
//--- Surface.ROTATION_90 : 가로
//--- Surface.ROTATION_180 : 세로
//--- Surface.ROTATION_270 : 가로
int rotation = display.getRotation();
화면 회전 금지 방법 1
AndroidManifest.xml에서 모든 Activity에 다음을 추가 한다.
android:screenOrientation="portrait" //--- 세로 화면 고정
android:screenOrientation="landscape" //--- 가로 화면 고정
화면 회전 금지 방법 2
//--- public void onCreate(Bundle savedInstanceState) 함수에서
//--- setContentView(~); 다음에 아래 라인을 추가 한다.
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //--- 세로 화면 고정
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //--- 가로 화면 고정
화면이 회전해도 Activity가 다시 로딩되지 않도록 하는 방법
Activity가 다시 로딩되지 않으므로 화면의 크기는 변하지 않는다. 따라서 수작업으로 화면을 조정해 주어야 한다.
AndroidManifest.xml에서 모든 Activity에 다음을 추가 한다.
android:configChanges="keyboardHidden|orientation"
모든 Activity에 다음을 추가 한다.
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
switch(newConfig.orientation) {
case Configuration.ORIENTATION_PORTRAIT: //--- 수작업으로 세로 화면 생성
//--- onCreate(~)에서 처리한 것을 똑같이 처리 한다.
//--- 단, 기존에 데이터가 있는 것을 그것을 그대로 활용 한다.
//--- 아래 break 이전의 코드는 사례이므로, 대신의 자신의 적절한 코드를 삽입 한다.
setContentView(R.layout.infromation);
restoreStatus();
setupViews();
break;
case Configuration.ORIENTATION_LANDSCAPE: //--- 수작업으로 가로 화면 생성
setContentView(R.layout.infromation);
restoreStatus();
setupViews();
break;
}
}
화면 회전시 정보를 저장한 후 복구하는 방법
public void onCreate(Bundle savedInstanceState)에 복구와 관련된 코딩을 한다.
Object obj = getLastNonConfigurationInstance()
if (obj != null) {
HashMap map = (HashMap) obj;
//--- 저장된 복구 데이터로 화면 또는 Thread를 복구 한다.
}
public void onDestroy()에 화면 종료와 관련된 코딩을 한다.
public void onDestroy() {
if (isFinishing()) {
//--- 화면이 종료될 때, Thread 처리 등을 한다.
//--- worker.interrupt();
//--- worker = null;
} else {
//--- 화면이 회전할 때
}
super.onDestroy();
}
public Object onRetainNonConfigurationInstance()에 화면 회전시 데이터를 저장하는 코딩을 한다.
public Object onRetainNonConfigurationInstance() {
HashMap map = null;
map = new HashMap();
//--- 화면 또는 Thread에서 복구할 데이터를 저장 한다.
return map;
}
View
Droid Draw
DroidDraw Beta : 화면을 그리면 XML (layout) 파일을 생성해 준다.
![500px](img/DroidDraw 001.png)
{|cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center"
|-
|width="20%" align="center" style="background-color:#eee;"|주요 기능
|width="80%" align="center" style="background-color:#eee;"|상세 설명
|-
|align="center"|File -> Open
|
Android Layout 파일을 연다. align="center" Android Layout에서 사용하는 String, Color, Arrary, Drawables 저장 폴더를 연다. align="center" 드래그앤드랍 등을 사용하여 작성한 화면에 해당하는 Android Layout을 Output 영역에 생성한다. align="center" Output 영역에 입력된 XML 파일을 사용하여 화면을 생성 한다.
|}
Android의 화면 구성 요소
{|cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center"
|-
|width="20%" align="center" style="background-color:#eee;"|View
|width="80%"|
기본 사용자 인터페이스 클래스
public class android.view.View
:implements android.graphics.drawable.Drawable.Callback,: KeyEvent.Callback, AccessibilityEventSource align="center" style="background-color:#eee;" 여러 개의 자식 뷰를 담을 수 있는 뷰 클래스의 확장
public abstract class android.view.ViewGroup extends View:implements ViewParent, ViewManager align="center" style="background-color:#eee;" Control : 상대적으로 간단한 기능을 구현하는 뷰의 확장
Widget : 복잡한 컨트롤과 좀더 복잡한 뷰의 확장
android.widget.~ align="center" style="background-color:#eee;" 화면 위에 있는 자식 컨트롤의 위치를 제어하기 위해 설계된 ViewGroup 클래스의 확장
public class android.widget.FrameLayout extends ViewGroup
public class android.widget.LinearLayout extends ViewGroup
public class android.widget.RelativeLayout extends ViewGroup
public class android.widget.TableLayout extends LinearLayout:public static class LayoutParams extends android.view.ViewGroup.MarginLayoutParams align="center" style="background-color:#eee;" public interface android.view.Menu
MenuItem, SubMenu
Activity의 메뉴 관련
아이콘 메뉴, 확장 메뉴, 하위 메뉴
OptionMenu : onCreateOptionMenu : onPrepareOptionsMenu, onOtionsItemSelected
ContextMenu : onCreateContextMenu, onContextItemSelected
PanelMenu : onCreatePanelMenu, onPreparePanel
|}
TextView, TextEdit, Spinner
Button, ToggleButton, CheckBox (RadioButton, RadioGroup)
DatePicker, TimePicker
ProgressBar, SeekBar, RatingBar
Chronometer, AnalogClock, DigitalClock
옵션 메뉴
OptionMenu, Menu, SubMenu
문맥 메뉴
ContextMenu, onCreateContextMenu(), registerForContextMenu(), onContextItemSelected()
제스처
GestureDetector, onGestureListener, onTouchEvent
화면 방향
OrientationEventListener, SensorManager
Style, Theme
/tools/hierarchyviewer
Layout
FrameLayout. 중첩, Linearlayout. 선형, RelativeLayout. 상대, TableLayout. 표
ViewGroup
ImageSwitcher, ScherollView, TabHost, ListView
AdapterView
ListView, GridView, GalleryView
ArrayAdapter, CursorAdapter
ListActivity
TabActivity, TabHost
기타
Switcher, Dialog, Schroll~, SlidingDrawer
AppWidget
GPS, 멀티미디어
상태표시줄, 진동, 지시등, 소리내기, 알림
((ViewStub) findViewById(R.id.stub_import)).setVisibility(View.VISIBLE);
merge
Focus
Focus
nextFocusDown, nextFocusLeft, nextFocusRight, nextFocusUp
View getCurrentFocus()
void onWindowFocusChanged(boolean hasFocus)
boolean hasWindowFocus()
xml 파일에서 view에 포커스를 가져가는 태그
Event
Key
onKeyDown(int keyCode, KeyEvent event)
onKeyLongPress(int keyCode, KeyEvent event)
onKeyUp(int keyCode, KeyEvent event)
onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
onBackPressed()
onTouchEvent(MotionEvent event)
onTrackballEvent(MotionEvent event)
onWindowAttributesChanged(android.view.WindowManager.LayoutParams params)
onContentChanged()
onMenuOpened(int featureId, Menu menu)
onMenuItemSelected(int featureId, MenuItem item)
onConfigurationChanged(Configuration newConfig)
onLowMemory()
android.widget
AbsListView
AbsoluteLayout
AbsSeekBar
AbsSpinner
Adapter
AdapterView
AlphabetIndexer
AnalogClock
ArrayAdapter
AutoCompleteTextView
BaseAdapter
BaseExpandableListAdapter
Button
Checkable
CheckBox
CheckedTextView
Chronometer
CompoundButton
CursorAdapter
CursorTreeAdapter
DatePicker
DialerFilter
DigitalClock
EditText
ExpandableListAdapter
ExpandableListView
Filter
Filterable
FilterQueryProvider
FrameLayout
Gallery
GridView
HeaderViewListAdapter
HorizontalScrollView
ImageButton
ImageSwitcher
ImageView
LinearLayout
ListAdapter
ListView
MediaController
MultiAutoCompleteTextView
PopupWindow
ProgressBar
QuickContactBadge
RadioButton
RadioGroup
RatingBar
RelativeLayout
RemoteViews
ResourceCursorAdapter
ResourceCursorTreeAdapter
Scroller
ScrollView
SectionIndexer
SeekBar
SimpleAdapter
SimpleCursorAdapter
SimpleCursorTreeAdapter
SimpleExpandableListAdapter
SlidingDrawer
Spinner
SpinnerAdapter
TabHost
TableLayout
TableRow
TabWidget
TextSwitcher
TextView
TimePicker
Toast
ToggleButton
TwoLineListItem
VideoView
ViewAnimator
ViewFlipper
ViewSwitcher
WrapperListAdapter
ZoomButton
ZoomButtonsController
ZoomControls
TextView
View의 visibility 속성
visible: 보이는상태
invisible: 숨겨져있지만 자리는차지
gone: 숨겨지며 자리도 차지x
EditText
Android Developers - InputType
android:inputType="number"
textUri, textEmailAddress, textPassword, number, numberSigned, phone
datetime, date, time
none, text
textAutoComplete
textMultiLine, textImeMultiLine
Button
ListView
ListView는 다수의 자료를 목록의 형태로 보여주는 View로 Android에서 상당히 유용한 View 이다. 여기서는 예제를 사용하여 ListView에 대해 간단하게 살펴보자.
ListView를 사용하기 위한 구성 요소와 예제
{|cellspacing="0" cellpadding="2" border="1" width="100%" bgcolor="#FFFFFF" align="center"
|-
|width="20%" align="center" style="background-color:#eee;"|Activity
|width="80%"|예제 - MessageActivity.java : ListView를 포함하는 화면으로 사용자가 상호 교류 한다. align="center" style="background-color:#eee;" ListView를 보여주는 Layout은 android:list와 android:empty 라는 아이디를 가진 View를 포함하여야 한다.
android:list : 데이터가 있을 겨우에 보여주는 ListView
android:empty : 데이터가 없을 경우에 보여주는 View (TextView 등 여러가지 View를 사용할 수 있다.)
예제 - list_activity.xml : ListView를 포함하는 layout
예제 - list_row.xml : ListView에서 각 행을 보여주는 layout align="center" style="background-color:#eee;" Adapter는 목록의 형태로 데이터를 보여주는 View에서 데이터를 관리하는 용도로 사용된다. 주로 ListView, GridView, GalleryView 등에서 사용되며 BaseAdapter, ArrayAdapter, CursorAdapter 등 다양한 종류의 adapter가 존재 한다. 예제 - MessageAdapter.java : ListView와 연동되어 ListView에 보여지는 데이터를 관리 align="center" style="background-color:#eee;" ListView에서 한 행에 보여지는 데이터가 많을 경우 POJO 클래스를 만들어 관리 한다. 예제 - Message.java : DB와 연동하여 데이터를 저장하는 POJO 클래스 align="center" style="background-color:#eee;" 예제 - message_context.xml : ListView를 오래 누르고 있을 때 나타나는 Context Menu 정의
|}
아래에서는 위 각각의 구성요소에 대해서 중요한 사항을 위주로 설명 한다. 단, SQLite3를 사용하여 DB에 접속하는 로직은 이 범위를 벗어나므로 생략 한다. 개인적으로 테스트용으로 만든 안드로이드 앱을 가지고 설명을 하니 이름은 향후 필요한대로 변경하여 사용하기 바란다.
Activity : MessageActivity.java
구현의 편의상 ListActivity를 상속 받아 MessageActivity를 구현 한다.
public class MessageActivity extends ListActivity implements OnClickListener {
private SmartAndroidApplication app = null;
private ListView list = null;
private MessageAdapter adapter = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView('''R.layout.list_activity''');
//--- android:list 아이디를 가진 ListView를 가져오기 위해 android.R.id.list를 사용 한다.
list = (ListView) findViewById('''android.R.id.list''');
//--- ListView에 Context Menu를 사용할 수 있도록 설정 한다.
//--- Context Menu : View를 오랫동안 누르고 있을 때 표시되는 Menu
registerForContextMenu(getListView());
list.setItemsCanFocus(true);
//--- Database를 관리하기 위해 SmartAndroidApplication 클래스를 만들어 사용 한다.
//--- 여기서 DB(SQLite3)를 관리하는 부분은 생략 한다.
app = (SmartAndroidApplication)getApplication();
//--- getCurrentMessages() 함수는 DB를 읽어 ArrayList를 반환 한다.
adapter = new MessageAdapter(this, app.getCurrentMessages());
//--- ListView와 Adapter를 서로 연결 한다.
//--- Adapter에 있는 데이터가 ListView에 표시 된다.
'''setListAdapter(adapter);'''
}
//--- Message 등록 버튼과 입력 항목은 이번 예제에서는 생략 하였다.
public void onClick(View v) {
Message msg = null;
if (v.getId() == R.id.insert_button) {
//--- 등록 버튼을 선택되었을 경우, '''ListViw에서 행 등록'''
msg = new Message();
msg.setMsg("등록할 메시지");
msg.setId(app.insertMessage(msg)); //--- DB에 메시지 등록
'''adapter.add(msg);'''
}
}
//--- ListView가 눌러졌을 때 실행되는 함수 이다.
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
//--- 생략
}
//--- Context Menu를 표시 한다.
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
switch (v.getId()) {
case android.R.id.list:
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.message_context, menu);
}
}
//--- Context Menu가 선택되었을 경우의 처리를 한다.
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info = null;
Message msg = null;
if (item.getItemId() == R.id.message_menu01) {
info = (AdapterContextMenuInfo)item.getMenuInfo();
//--- '''ListViw에서 행의 내용 수정'''
//--- ListView의 선택된 행의 번호 : info.position
msg = adapter.getItem(info.position);
msg.setMsg("수정할 내용");
app.updateMessage(msg); //--- DB에서 메시지 수정
'''adapter.remove(msg);'''
'''adapter.insert(msg, info.position);'''
} else if (item.getItemId() == R.id.message_menu02) {
info = (AdapterContextMenuInfo)item.getMenuInfo();
//--- '''ListViw에서 행 삭제'''
msg = adapter.getItem(info.position);
app.deleteMessage(msg.getId()); //--- DB에서 메시지 삭제
'''adapter.remove(msg);'''
}
return true;
}
}
Layout : /res/layout/list_activity.xml
ListView를 구성하는 화면으로 android:list와 android:empty를 가진다.
android:list : 데이터가 있을 겨우에 보여주는 ListView
android:empty : 데이터가 없을 경우에 보여주는 View
Layout : /res/layout/list_row.xml
ListView에서 각 행을 표시하는 layout으로 여기서는 편의상 meseage_id와 message_msg만 사용해 보자.
Adapter : MessageAdapter.java
구현의 편의상 BaseAdapter가 아니라 ArrayAdapter를 상속 받아 MessageAdapter를 구현 한다.
getView(~) 함수에서 ListView의 각 행을 표시하는 View를 생성하여 반환 한다.
public class MessageAdapter extends ArrayAdapter {
private Activity context = null;
private ArrayList messages = null;
public MessageAdapter(Activity context, ArrayList messages) {
this.context = context;
this.messages = messages;
}
//--- ListView의 각 행을 표시하는 View를 생성하여 반환 한다.
public View getView(int position, View convertView, ViewGroup parent) {
View layout = null;
int realPosition = 0;
//--- 행을 표시하는 Layout을 불러 온다.
if (null == convertView) {
LayoutInflater inflater = context.getLayoutInflater();
layout = inflater.inflate('''R.layout.list_row''', null);
} else {
layout = convertView;
}
//--- Message의 id를 화면에 표시 한다. (position 행에 표시됨)
TextView message_id = (TextView) layout.findViewById('''R.id.message_id''');
message_id.setText(Long.toString(messages.get(position).getId()));
//--- Message의 msg를 화면에 표시 한다. (position 행에 표시됨)
TextView message_msg = (TextView) layout.findViewById('''R.id.message_msg''');
message_msg.setText(messages.get(position).getMsg());
return layout;
}
}
데이터 클래스 : Message.java
데이터를 저장하는 클래스로 여기서는 편의상 id와 msg만 사용해 보자.
public class Message implements Serializable {
private long '''id''' = 0l;
private String '''msg''' = null;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
}
Menu : /res/menu/message_context.xml, 메뉴 파일
@string/message_menu01 : 수정
@string/message_menu02 : 삭제
Spinner
Spinner는 여러개의 목록에서 값을 선택하고자 할 때 사용하는 View 이다. HTML에서 보면 select 태그와 동일한 기능을 한다.
/res/layout/~.xml
/res/values/~.xml
선택 목록을 배열로 관리하면 편리 하다.
getResources().getStringArray(R.array.smartsearch_max_contacts_array)로 문자열 배열을 가져올 수 있다.
- 10
- 20
- 30
- 40
- 50
- 100
- 200
- 500
- 1000
Activity
implements android.widget.AdapterView$OnItemSelectedListener 를 구현 하여야 한다.
private int maxContacts = 100;
private int maxContactsPos = 5;
private Spinner vMaxContacts = null;
ArrayAdapter maxContactsAdapter= null;
vMaxContacts = (Spinner)findViewById(R.id.max_contacts);
maxContactsAdapter = ArrayAdapter.createFromResource(this,
R.array.smartsearch_max_contacts_array, android.R.layout.simple_spinner_item);
maxContactsAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
vMaxContacts.setAdapter(maxContactsAdapter);
vMaxContacts.setOnItemSelectedListener(this);
vMaxContacts.setSelection(maxContactsPos); //--- 선택값을 지정할 때마다 onItemSelected 함수가 호출됨
//--- parent. 상위 View, view. 선택된 뷰, position. Adapter에서 view의 위치, id. 선택된 항목의 row id
public void onItemSelected(AdapterView> parent, View view, int position, long id) {
if (parent == vMaxContacts) {
maxContactsPos = position;
maxContacts = Integer.parseInt(parent.getItemAtPosition(position).toString());
}
}
public void onNothingSelected(AdapterView> parent) {
}
Notification, Alarm
Toast
android.widget.Toast
화면에 일시적인 메시지를 보여 준다. 메시지는 텍스트를 사용하여 보여 주거나 뷰를 사용하여 보여 준다. 아래 그림은 Toast 메시지가 표시되는 방식을 알려 준다.
메시지를 사용하여 Toast 메시지를 보여 준다.
//--- duration : 메시지가 표시되는 시간
//--- Toast.LENGTH_SHORT, Toast.LENGTH_LONG
Toast.makeText(Context context, CharSequence text, int duration).show();
Toast.makeText(Context context, int resId, int duration).show();
View를 사용하여 Toast 메시지를 보여 준다.
//--- View를 사용하여 메시지를 보여줄 화면을 생성 한다.
LayoutInflater inflater = getLayoutInflater();
View toastView = inflater.inflater(R.layout.toast_view, null);
TextView message = (TextView) layout.findViewById(R.id.message);
message.setText("Toast Message");
//--- Toast를 사용하여 메시지를 보여 준다.
Toast toast = new Toast(this);
toast.setView(toastView);
toast.setDuration(Toast.LENGTH_LONG);
toast.show();
Notification
android.app.Notification
Notification은 사용자가 지정한 시간에 메시지를 보여 주고 사용자가 등록한 Activity를 실행 한다. Notification은 Notification Manager에 의해 관리되며 화면 최상단의 상태바에 표시된다.
Activity에서 Notification을 등록하여 보자.
//--- Notification Manager를 생성 한다.
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//--- Notification과 동시에 실행할 Activity를 PendingIntent를 사용하여 지정 한다.
//--- 여기서는 null을 지정하여 Activity를 실행하지 않는다.
PendingIntent notifIntent = PendingIntent.getActivity(this, 0, null, 0);
//--- public Notification(int icon, CharSequence tickerText, long when)
//--- icon : 아이콘
//--- tickerText : 표시할 메시지
//--- when : Notification을 표시할 시간
Notification notif = new Notification(R.drawable.icon, "invalid userid", System.currentTimeMillis());
//--- public void setLatestEventInfo(Context context, CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent)
//--- contentTitle : Notification의 제목
//--- contentText : Notification의 내용
//--- contentIntent : 실행할 Activity를 지정하고 있는 PendingIntent
notif.setLatestEventInfo(this, "title", "text", notifIntent);
notif.number++;
nm.notify(notif.number, notif); //--- Notification의 고유한 번호로 notif.number를 사용 한다.
Notification이 안드로이드에 의해서 어떻게 표시되는지 그림으로 확인해 보자.
화면 최상단의 상태바에 Notification 아이콘과 tickerText가 표시 된다.
약간의 시간이 지난 후 다음과 같이 표시가 변경 된다. 여기서 1은 등록된 Notification 갯수 이다.
화면 최상단의 상태바를 아래로 당기면 상세한 Notification 정보를 볼 수 있다.
"지우기" 버튼을 누르면 등록된 Notification이 삭제 된다.
AlarmManager
android.app.AlarmManager
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.SECOND, 30);
Intent intent = new Intent(GenerateAlarm.this, AlarmReceiver.class);
//--- PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags)
//--- PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags)
//--- PendingIntent getService(Context context, int requestCode, Intent intent, int flags)
PendingIntent appIntent = PendingIntent.getBroadcast(GenerateAlarm.this, 0, intent, 0);
//--- RTC : System.currentTimeMillis() 알람 시간
//--- RTC_WAKEUP : System.currentTimeMillis() 알람 시간, 기기 작동
//--- ELAPSED_REALTIME : SystemClock.elapsedRealtime() 알람 시간 (부팅 이후 시간)
//--- ELAPSED_REALTIME_WAKEUP : SystemClock.elapsedRealtime() 알람 시간, 기기 작동
//--- set(int type, long triggerAtTime, PendingIntent operation)
//--- setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeMillis(), appIntent);
Dialog
AlertDialog의 종류
OK Cancel dialog with a message
OK Cancel dialog with a long message
List dialog
Progress dialog
Single choice list
Multi choice list
Text Entry dialog
Single choice list
public class AlertDialog extends Dialog
/res/values/~.xml
Dialog에서 보여줄 선택 목록을 정의 한다.
- UTF-8
- Shift_JIS
- ISO-8859-1
Activity
private static final int DIALOG_SINGLE_CHOICE_CATEGORY = 0;
//--- Dialog를 화면에 표시 한다.
showDialog(DIALOG_SINGLE_CHOICE_CATEGORY); //--- Dialog 표시
//--- 화면에 표시할 Dialog를 작성 한다.
protected Dialog onCreateDialog(int id) {
AlertDialog.Builder builder = null;
AlertDialog alert = null;
switch (id) {
case DIALOG_SINGLE_CHOICE_CATEGORY:
builder = new AlertDialog.Builder(this);
builder.setIcon(R.drawable.smartqrcode_icon); //--- 아이콘 지정
builder.setTitle(R.string.smartqrcode_category); //--- 제목 지정
builder.setSingleChoiceItems(
R.array.smartqrcode_category_array, //--- 선택 목록 지정
0, //--- 초기 선택 값 지정 (0, 1, 2, ...)
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int item) { //--- item. 선택된 값의 index
String[](.md) items = null;
String strItem = null;
items = getResources().getStringArray(R.array.smartqrcode_category_array);
strItem = items[item](item.md); //--- 선택된 항목
dialog.dismiss(); //--- Dialog 닫기
}
}
);
alert = builder.create();
break;
}
return alert;
}
ProgressDialog
진행 바퀴 또는 진행 바를 보여 주는 Dialog
Activity
private static final int DIALOG_SEARCHING = 0;
showDialog(DIALOG_SEARCHING); //--- Dialog 보이기
dismissDialog(DIALOG_SEARCHING); //--- Dialog 보이지 않기
removeDialog(DIALOG_SEARCHING); //--- Dialog 완전 제거
protected Dialog onCreateDialog(int id) //--- showDialog(~)로 호출
protected void onPrepareDialog(int id, Dialog dialog) //--- Dialog가 보여질 때마다 호출, 동적으로 Dialog 구성
onCreateDialog 사례
private static final int DIALOG_SEARCHING = 0;
protected Dialog onCreateDialog(int id) {
ProgressDialog dialog = null;
Log.i(TAG, "onCreateDialog()");
switch (id) {
case DIALOG_SEARCHING:
dialog = ProgressDialog.show(SmartSearchActivity.this, "", "Searching ...", true);
dialog.setCancelable(true);
break;
default:
break;
}
return dialog;
}
DialogInterface.OnDismissListener()
Dialog가 종료될 때 onDismiss() 함수가 호출됨
DialogInterface.OnCancelListener()
Dialog가 취소될 때 OnCancel() 함수가 호출됨
참고 문헌
디자인 가이드
참고 문헌
분류: Android
오픈소스
Google
Mobile