태그 보관물: Toast

Android Toast Utility 클래스..

안드로이드에서 가장많이 사용하는 Widget중에 하나가 Toast입니다.

Toast는 기본적으로 SHORT(2초), LONG(3.5초) duration 만을 제공하고 있으면, 대체로 의미있는 표시를 할 수 있습니다. 간단하게 Toast를 사용하는 형태와, 첨부된 ToastUtil 클래스의 사용 형태를 살펴보면 아래와 같습니다.

기본 예)

Toast.makeText(context, message, Toast.LENGTH_SHORT).show();

ToastUtil 예)

ToastUtil.show(context, message);

안드로이드 API가 대체로 긴 클래스와 메소드가 많아서 코드의 가독성을 떨어트리는 경향이 있는데, 이런 유틸리티 클래스등으로 가독성을 높일 수 있습니다. 그리고, SHORT, LONG만이 아니, 개발자가 duration을 지정할 수있는 기능도 있습니다.

* ToastUtil.java

package net.sjava.toast;

import android.content.Context;
import android.os.CountDownTimer;
import android.widget.Toast;

public class ToastUtil {
   
    /**
     * 2초
     * @param c
     * @param message
     */
    public static void show(Context c, String message) {
        if(c == null || StringUtil.isEmpty(message))
            return;
       
        try {
            Toast.makeText(c, message, Toast.LENGTH_SHORT).show();
        } catch(Exception e) {
            // ignore
        }
    }
   
    /**
     * 3.5 초
     * @param c
     * @param message
     */
    public static void showLong(Context c, String message) {
        if(c == null || StringUtil.isEmpty(message))
            return;
       
        try {
            Toast.makeText(c, message, Toast.LENGTH_LONG).show();
        } catch(Exception e) {
            // ignore
        }
    }
   
    /**
     * 커스텀..
     * @param c
     * @param message
     * @param miliseconds
     */
    public static void show(final Context c, final String message, int miliseconds) {
        if(c == null || StringUtil.isEmpty(message))
            return;
       
        int duration = miliseconds;
        if(duration < 2000)
            duration = 2000;
       
        final Toast t = Toast.makeText(c, message, Toast.LENGTH_SHORT);
        new CountDownTimer(duration, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                t.show();
            }
           
            @Override
            public void onFinish() { }
        }.start();
    }
}

* StringUtil.java

package net.sjava.toast;

public class StringUtil {

    public static boolean isEmpty(String str) {
        if(str == null || str.trim().length() ==0)
            return true;
       
        return false;
    }
   
    public static boolean isAnyEmpty(String str1, String str2) {
        if(isEmpty(str1) || isEmpty(str2))
            return true;
       
        return false;
    }

    public static boolean isAllEmpty(String str1, String str2) {
        if(isEmpty(str1) && isEmpty(str2))
            return true;
       
        return false;
    }
}

Android Toast duration 조정하기..

안드로이드에서는 메세지를 보여주고 사라지는 용도로 Toast를 빈번하게 사용하고 있습니다.
하지만, 아쉬운 점이 하나 있다면, duration을 설정할 수 없습니다.
그래서, 간단하게 duration을 변경하는 방법으로, Toast의 show()를 쓰레드로 원하는 시간 만큼 계속 보여주면 쉽게 해결할 수 있습니다.

간단하게, 안드로이드 Toast 클래스에서 제공하는 SHORT과 LONG의 기본 시간값입니다..

private static final int LONG_DELAY = 3500; // 3.5 seconds
private static final int SHORT_DELAY = 2000; // 2 seconds

아래는 CountDownTimer를 이용해서 총 4초동안, 1초씩 줄어들면서 Toast의 show() 메소드를 호출해서, 총 6초(Toast.LENGTH_SHORT이 duration 이니)동안 메세지를 보여주는 코드입니다..

final Toast toast = Toast.makeText(context(), getString(R.string.login_error),Toast.LENGTH_SHORT);
toast.show();
new CountDownTimer(4000, 1000) {
  public void onTick(long millisUntilFinished) {toast.show();}
  public void onFinish() {toast.show();}
}.start();

또 다른 방법으로 https://github.com/quiqueqs/Toast-Expander/blob/master/src/com/thirtymatches/toasted/ToastExpander.java 에서 쓰레드로 시간을 빼면서 루프를 돌리는 방법도 있습니다.