programing

Android-표시된 모든 토스트 메시지 숨기기

goodcopy 2021. 1. 17. 11:56
반응형

Android-표시된 모든 토스트 메시지 숨기기


현재 표시된 모든 토스트 메시지를 제거하려면 어떻게합니까?

내 앱에는 사용자가 항목을 클릭하면 토스트 메시지가 10 개 항목-10 개 토스트 메시지가 표시되는 목록이 있습니다.

따라서 사용자가 10 번 클릭 한 다음 메뉴 버튼을 누르면 메뉴 옵션 텍스트를 읽을 수있을 때까지 몇 초 동안 기다려야합니다.

그렇게해서는 안됩니다 :)


내 해결책은 활동에서 단일 토스트를 초기화하는 것이 었습니다. 그런 다음 클릭 할 때마다 텍스트를 변경합니다.

Toast mToast = Toast.makeText(this, "", Toast.LENGTH_SHORT);
if (a) {
  mToast.setText("This is a");
  mToast.show();
} else if (b) {
  mToast.setText("This is b");
  mToast.show();
}

현재 처리중인 모든 토스트 메시지를 비활성화하려면 어떻게합니까?

개체 Toasts를 호출 cancel()하여 개인 취소 할 수 있습니다 Toast. AFAIK, 모든 미결제를 취소 할 수있는 방법은 없습니다 Toasts.


토스트가 이미 표시되고 있는지 확인하는 것은 어떻습니까?

private Toast toast;
...
void showToast() {
   if (toast == null || toast.getView().getWindowVisibility() != View.VISIBLE) {
      toast = Toast.makeText(getActivity(), "Toast!", Toast.LENGTH_LONG);
      toast.show();
   }
}

Mudar의 솔루션은 비슷한 문제에서 나에게 아름답게 작동했습니다 button. 여러 번의 클릭 후 백 로그에 다양한 토스트가 쌓였습니다 .

다른 setText()sshow()s를 가진 Toast의 한 인스턴스는 내가 찾고 있던 답이었습니다. 새 버튼을 클릭하자마자 이전 메시지가 취소되었습니다. 에 딱 맞다

참고로 제가 한 작업은 다음과 같습니다.

에서 OnCreate:

    final Toast myToast = Toast.makeText(getBaseContext(), "", Toast.LENGTH_SHORT);

각 내에서 OnClick:

myToast.setText(R.string.toast1);
myToast.show();

내 해결책은 모든 토스트 참조를 목록에 저장하고 필요할 때 모두 취소하는 방법을 만드는 것입니다.

private ArrayList<Toast> msjsToast = new ArrayList<Toast>();

private void killAllToast(){
    for(Toast t:msjsToast){
        if(t!=null) {
            t.cancel();
        }
    }
    msjsToast.clear();
}

Toast를 만들 때 다음과 같이하고 참조를 저장합니다.

Toast t = Toast.makeText(context, "Download error: xx", Toast.LENGTH_LONG);
t.show();
msjsToast.addToast(t);

삭제해야하는 경우 :

killAllToast();

이를 전역 클래스의 정적 메서드처럼 만들고이를 사용하여 앱의 모든 알림을 종료 할 수 있습니다.


나는 토스트 메시지가 나를 위해 대기하지 않는 방법을 찾은 것 같습니다. 내가 나눌 것이라고 생각했다.

이 부분이 맨 위에 있습니다.

private Toast msg;    

이 부분은 내 setOnTouchListener ()에 들어갑니다.

if(null == msg)
{
msg = Toast.makeText("Message to user!", Toast.LENGTH_SHORT);
msg.setGravity(Gravity.CENTER, msg.getXOffset() / 2, msg.getYOffset() / 2);
msg.show();

//handels the stupid queueing toast messages
new Handler().postDelayed(new Runnable()
{
      public void run()
      {
          msg = null;

      }
}, 2000);

}

그것은 무엇보다 해킹에 가깝습니다. 하지만 누군가가 내 앱의 일부를 즐겨 찾기에 추가 할 때마다 토스트 메시지를 표시합니다. 그리고 그들이 즐겨 찾기 버튼을 클릭하면 미쳐 버리면 토스트 메시지에 미쳐 버릴 것입니다. 하지만 더 이상은 아닙니다. 2 초간 기다린 다음 토스트 개체를 null로 설정하고 다시 표시 할 수 있습니다.


문제에 대한 간단한 대답은 다음과 같습니다.

먼저 활동에서 전역 Toast개체를 만듭니다.

    private Toast example;

이제 새 토스트 메시지를 호출 할 때마다 다음을 수행하십시오.

if(buttonClicked) {
    example.cancel();
    example = Toast.makeText(this, "" , Toast.LENGTH_SHORT);
    example.setText("Button Clicked");
    example.show();
}

이렇게하면 모든 Toast가 하나의 중앙 Toast에 보관되고 Toast 스팸이 제거됩니다. 이것은 빠른 대략적인 해결책이므로 더 우아한 방법이있을 수 있습니다.


onClick함수 외부에서 Toast 개체를 만들고 아래 코드를 사용합니다. 기존 Toast를 중지하고 최신 Toast를 시작합니다.

Toast mToast;

public void onClick(String abc) {

    if(mToast!=null)
        mToast.cancel();
    Context context = this;
    mToast = Toast.makeText(context, abc, Toast.LENGTH_SHORT);
    mToast.show();
}

이것이 내가하는 방법이다.

Toast toast;   

if(toast==null)
        toast=Toast.makeText(getApplicationContext(),R.string.act_now_private_post_text,Toast.LENGTH_LONG);
        else
            toast.setText(R.string.act_now_private_post_text);
        toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL,10,10);
        toast.show();

mToast=Toast.makeText(this, "", Toast.LENGTH_LONG);
        showToast.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {

                mToast.cancel();
                String text=null;
                if(ON)
                {
                    text="Toast is on";
                }
                else
                {
                    text="Toast is off";
                }
                mToast.setText(text);
                mToast.setDuration(Toast.LENGTH_SHORT);
                mToast.show();

            }
        });

이렇게 사용할 수 있습니다 ..

class MyToast {
private static Toast t;

public MyToast(Context ctx, String message) {
    if (t != null) {
        t.cancel();
        t = null;
    }
    t = Toast.makeText(ctx, message, Toast.LENGTH_SHORT);
}

public void show() {
    t.show();
}
}

위의 Madur의 탁월한 답변을 사용하여 다양한 유형의 메시지를 처리하는 클래스로 확장했습니다.

public class ToastManager {
    private Toast toastWarningMessage;
    private Toast toastAddMessage;
    ...

    public void messageWarning(Context context, String message) {
        if(toastWarningMessage == null) {
            toastWarningMessage = Toast.makeText(context, message, Toast.LENGTH_SHORT);
        } else {
            toastWarningMessage.cancel();
            toastWarningMessage.setText(message);
        }
        toastWarningMessage.show();
    }

    public void messageAdd(Context context, String message) {
        if(toastAddMessage == null) {
            toastAddMessage = Toast.makeText(context, message, Toast.LENGTH_SHORT);
        } else {
            toastAddMessage.cancel();
            toastAddMessage.setText(message);
        }
        toastAddMessage.show();
    }
    ...
}

그리고 이것은 내 주요 활동 내에서 호출됩니다.

ToastManager toastManager;
...
private void toastWarningMessage(String message) {
    if(toastManager == null) toastManager = new ToastManager();
    toastManager.messageWarning(this, message);
}

메시지를 분류하는 이유는 중요한 메시지를 덮어 쓰지 않도록하기위한 것입니다. 이 솔루션은 토스트 및 함수 이름의 이름 만 변경하기 때문에 재사용하기 쉽습니다.

사용자가 버튼에 스팸을 보내면 알림은 동일한 메시지 유형에 대해 매번 취소됩니다. 유일한 문제는 사용자가 여러 메시지를 스팸으로 보낼 수 있다는 것입니다. 이로 인해 첫 번째 메시지가 반복되고 마지막으로 만료되면 다른 메시지가 각각 한 번씩 표시됩니다. 큰 문제는 아니지만 알아 두어야 할 사항입니다.

Toast 인스턴스가 여러 개인 경우 가능한 단점을 조사하지 않았습니다.


In my app, queued toasts appearing again and again when app goes into background so I did following to solve the problem.

Add code to detect when app goes into background. One way to register life cycle handler. For More detail ref

registerActivityLifecycleCallbacks(new MyLifecycleHandler());

App.inBackground = true; when app goes to background and show toast using SmartToast class

public class SmartToast {

    static ArrayList<WeakReference<Toast>> toasts = new ArrayList<>();
    public static void showToast(@NonNull Context context,@NonNull String message){
        //this will not allowed to show toast when app in background
        if(App.inBackground) return;
        Toast toast = Toast.makeText(context,message,Toast.LENGTH_SHORT);
        toasts.add(new WeakReference<>(toast));
        toast.show();

        //clean up WeakReference objects itself
        ArrayList<WeakReference<Toast>> nullToasts = new ArrayList<>();
        for (WeakReference<Toast> weakToast : toasts) {
            if(weakToast.get() == null) nullToasts.add(weakToast);
        }
        toasts.remove(nullToasts);
    }

    public static void cancelAll(){
        for (WeakReference<Toast> weakToast : toasts) {
            if(weakToast.get() != null) weakToast.get().cancel();
        }
        toasts.clear();
    }

}

call SmartToast.cancelAll(); method when app goes into background to hide current and all pending toasts. Code is fun. Enjoy!


How about these !?

private Toast toast;

...
// Methods for short toast messages and long toast messages

    private void showShortToast(String message) {
        if(null != toast) toast.cancel();
        (toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT)).show();
    }

    private void showLongToast(String message) {
        if(null != toast) toast.cancel();
        (toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_LONG)).show();
    }

and at onPause()

@Override
    protected void onPause() {
...
if(null != toast) toast.cancel();
..
}

Here's how to disable toast messages, remove show() expression.

//Disable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT); 

//Enable notification message
Toast.makeText(this,"Message",Toast.LENGTH_SHORT).show();

ReferenceURL : https://stackoverflow.com/questions/2755277/android-hide-all-shown-toast-messages

반응형