태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

토스트(Toast)를 이용한 알림 메시지 표시

2009.04.06 12:59


Toast? 토스트!


Toast라면...토스트? 네, 맞습니다 맞고요. ㅎㅎ
토스트라는 이름은 마치 토스터기에서 나오는 빵처럼 화면에 톡~ 나타났다가 사라지는 특성 때문에 붙여진 것으로 보입니다. 

토스트는 설정을 변경했을 때, 혹은 어떤 이벤트가 발생했을 때 사용자에게 알려주는 데 매우 유용합니다. 현재 실행되고 있는 액티비티의 포커스를 뺏지도 않고, 잠시 표시되었다가 사라지므로 별도의 조작이 필요가 없죠.

이번 시간은 토스트를 만들어보겠습니다. 준비물은 식빵과 토스터기...만 있으면 되겠지요? (퍽)
에.죄송합니다. ㅠㅠ... 본론으로 들어가서.. 오늘 우리가 만들어볼 예제의 모습부터 보도록 하겠습니다.


위와 같이 토스트로 표시할 문자열과 Toast의 표시 시간을 지정한 후, 버튼을 누르면 토스트가 화면에 표시되게끔 구성하였습니다. 간단하지요?

토스트는 사용자에게 무엇인가를 알리는 다른 방법 (다이얼로그, Notification)에 비해 매우 간단합니다. 토스트를 표시할 시간과 표시할 문자열만 선택하는 것 외에 별다르게 설정할 것이 없지요.

그럼 본격적으로 예제를 보면서 하나하나씩 보도록 하겠습니다.

[어플리케이션 정보]

액티비티
  • ToastExample (ToastExample.java)

레이아웃
  • main.xml (ToastExample)

권한 (uses-permission)
  • 사용하지 않음

외부 라이브러리 (uses-library)
  • 사용하지 않음

API Level
  • 7 : Android 2.1

어플리케이션 소스 :
우선, 어플리케이션 레이아웃 코드부터 보도록 하겠습니다. RadioGroup과 RadioButton의 id를 잘 기억해주세요.

[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"> 

	<RadioGroup android:layout_height="wrap_content" 
		 android:orientation="horizontal" 
		 android:layout_width="fill_parent" 
		 android:gravity="center" android:id="@+id/radioGroup"> 
		 
		 <RadioButton android:layout_width="wrap_content" 
			 android:layout_height="wrap_content" 
			 android:id="@+id/radio_short" 
			 android:text="짧게 표시" android:checked="true"/>
	 
		<RadioButton android:layout_width="wrap_content" 
			 android:layout_height="wrap_content" 
			 android:id="@+id/radio_long" 
			 android:text="길게 표시" /> 
	
	</RadioGroup>

	<EditText android:layout_height="wrap_content" 
		 android:id="@+id/TextInput" 
		 android:layout_width="fill_parent" 
		 android:hint="표시할 메시지를 입력"/>
	
	<Button android:layout_height="wrap_content" 
		 android:id="@+id/ShowToast" 
		 android:text="Toast 표시하기!" 
		 android:layout_width="fill_parent" 
		 android:layout_gravity="center"/> 
	 
</LinearLayout>

그럼 본격적으로 소스코드를 하나하나씩 보도록 하겠습니다.

[ToastExample.java]
public class ToastExample extends Activity implements OnCheckedChangeListener{
	private int LENGTH_TO_SHOW = Toast.LENGTH_SHORT;
	private EditText textToShow;
	private RadioGroup radioGroup;
	private Button showToastButton;

위젯들의 인스턴스 선언 및 Toast 표시 시간을 담고 있는 LENGTH_TO_SHOW에 기본값으로 짧게 표시 (Toast.LENGTH_SHORT)를 넣어주고 있습니다. 또한, OnCheckedChangeListener 인터페이스를 구현하여 라디오버튼의 선택 처리를 할 수 있도록 하였습니다. (implements OnCheckedChangeListener)

[ToastExample.java]
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
                
        textToShow = (EditText)findViewById(R.id.TextInput);
        
        showToastButton = (Button)findViewById(R.id.ShowToast);
        showToastButton.setOnClickListener(new OnClickListener(){
        	public void onClick(View v){
  	       		Toast.makeText(ToastExample.this,
        	        		textToShow.getText().toString(), 
        	        		LENGTH_TO_SHOW).show();    		
        	}
        });
        
        radioGroup = (RadioGroup)findViewById(R.id.radioGroup);
        radioGroup.setOnCheckedChangeListener(this);
    }

다음, onCreate() 메소드에서는 버튼의 인스턴스를 받아오고 버튼을 누르면 토스트 메시지를 표시하도록 리스너를 구현하고 있습니다. 토스트는 makeText() 메소드로 인스턴스를 생성 후 show() 메소드를 사용하여 토스트를 화면에 표시합니다. 토스트를 표시할 시간은 미리 LENGTH_TO_SHOW에 담아두었으므로, 그 값을 사용하는 것을 확인할 수 있습니다.

API
public static Toast makeText (Context context, int resId, int duration)
public static Toast makeText (Context context, CharSequence text, int duration)

토스트 인스턴스를 생성합니다. 문자열 리소스와 문자열 모두 사용 가능하며 (문자열 리소스 : resId, 문자열 : text) duration에 토스트를 표시할 시간 (Toast.LENGTH_SHORT, Toast.LENGTH_LONG) 을 지정합니다. 

위의 과정을 거쳐 토스트의 인스턴스를 생성한 후에, show() 메소드를 호출해야 화면에 토스트가 표시되므로 이 메소드를 쓰는 것을 잊지 않도록 합시다. (실제로 show() 메소드를 빼먹는 경우가 종종 있더군요)

마지막에는 짧게 표시/길게 표시를 선택하는 라디오버튼을 담고 있는 RadioGroup의 인스턴스를 받아온 뒤, setOnCheckedChangeListener()를 통해 라디오버튼 선택에 변화가 일어났을 때의 동작을 처리할 리스너를 등록합니다. 마지막으로 이 리스너를 보도록 하죠.

[ToastExample.java]
	@Override
	public void onCheckedChanged(RadioGroup group, int checkedId) {
		switch(checkedId){
		case R.id.radio_long:
			LENGTH_TO_SHOW = Toast.LENGTH_LONG;
			break;
		case R.id.radio_short:
			LENGTH_TO_SHOW = Toast.LENGTH_SHORT;
			break;
		}
		
	}
위와 같이, 각각을 선택할 때마다 토스트를 표시할 시간을 설정해줍니다. LENGTH_TO_SHOW의 값을 바꿔줌으로써 토스트 표시하기 버튼을 누르면 해당 시간에 맞게끔 토스트가 표시되게 됩니다.

어플리케이션을 실행한 모습은 아래와 같습니다. 표시 시간을 선택한 후, 토스트에 표시할 문자열을 입력 후 버튼을 누르면 해당 시간동안 토스트가 표시되는 것을 확인할 수 있습니다.



커니 유저 인터페이스/토스트(Toast) , , , , , ,

  1. Blog Icon
    KITE

    강좌 잘 보고 있습니다. 뭐 잘 아시겠지만 context 는 일반적으로 OS 에서 사용되는 그 context 인 것 같군요. 단지 process 가 아닌 application (뭐 결국 이게 process 에 해당하겠지만) 적용되는 context 겠지요. 뭐 간단하게 얘기하자면 context 는 멀티 테스킹에서 하나의 테스킹이 다른 테스킹과 구분되는 최소한의 집합이랄까 그러니까 실제로 프로세서는 한번에 한가지 일밖에 못하잖아요. 그래서 멀티테스킹의 경우 다른 프로세스를 번갈아 가며 실행하는데 이 때 다른 프로세스로 바뀔 때 바뀌어야 하는 데이타 랄까 해야 할 일들의 집합이라고 생각하시면 편합니다.
    뭐 별거 아닌 거 같지만 의외로 중요한 문제죠. 사실상 context switching 은 OS 의 성능에서 가장 중요한 문제입니다. 일을 번갈아 가면서 하는데 일을 바꾸는데 걸리는 시간이 많이 걸리면 하나씩 하느니만 못하니까요. 패러메터로 context 를 가진다는 것은 해당 프로세스의 라이프 사이클에 대한 처리를 직접할 수 있다는 의미로 생각하시면 됩니다. 음 저도 프로그램 손 놓은지 오래돼서 ... 맞는 건지..

  2. 와우, 명쾌한 설명 감사합니다!
    전 완전히 개념을 잡지 못하고 있었는데... KITE님 설명덕분에 제데로 알 수 있게 되었습니다. ㅎㅎ

  3. Blog Icon
    kippee

    그렇군요. Context 란 무엇인지 항상 궁금했는데...

  4. 저도 항상 궁금했었답니다 ㅎㅎ

  5. Blog Icon
    조영주

    한가지 질문을. toast를 사용했을때 사라지는 시점을 파악할수 있을까요?
    사라지는 시점에 finish(); 사용하고 싶은데 잘몰라서요 ㅠㅠ 도와주세요

  6. 사라지는 시점이 명확하제 정의되어있지는 않습니다 ^^;
    Toast 자체가 짧게표시하기, 길게 표시하게 두 가지 정보로만 구성되는 "간단한" 표시 클래스라서요-~

  7. Blog Icon
    초보초보ㅋㅋㅋ

    이번 강좌 따라하면서 해보는 중에 소스에서 에러가 발생하는 부분이 있어서요~~
    radio_long.setOnClickListener(new OnClickListener(){ <- 요기서 (new OnClickListener() 를
    (new View.OnClickListener() 로 모두 바꾸고 디버깅 했습니다~~

    저만 그런가요 ,,;?

  8. 어떤 에러가 발생하나요?
    그냥 에러가 발생한다고만 말씀하시면 정확히 어떤 것 때문에 그러는지 알기가 힘들어요~ ^^;

  9. Blog Icon
    WindRunner

    import문제 같네요.
    import android.view.View.OnClickListener;
    이거하시면 될듯요.

  10. Blog Icon
    ><

    담아갈게요~><

  11. Blog Icon
    cdw1205

    안녕하세요 커니님 저는 인천대학교학생입니다.
    이번에 스터디를 하게되어 유저인터페이스 부분을 쓰고 싶은데 사용해도 되는지 궁금하네요~
    메일주소를 찾아볼 수 없어서 여기에 남깁니다. 답변해주시면 감사하겠습니다.

  12. 네 사용하셔도 좋습니다.
    단 출처를 명시해주세요~

  13. Blog Icon
    cdw1205

    감사합니다~ 출처는 꼭 명시하도록 하겠습니다.

  14. 좋은글 잘 읽었습니다. 출처를 표시하고 블로그에 담아갑니다. ^^

  15. Blog Icon
    dd

    글 잘읽었습니다!! 그런데 궁금한 점이
    radiogroup 은 역할이 뭔가요? toast가 잠시 띄우는 역할인데 radiogroup 이 toast사용시에 꼭 필요한 것인가요?
    자바를 처음 배워서 잘 모르겟습니다 ㅠㅠ