본문 바로가기

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

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


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의 값을 바꿔줌으로써 토스트 표시하기 버튼을 누르면 해당 시간에 맞게끔 토스트가 표시되게 됩니다.

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