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()s
및 show()
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
'programing' 카테고리의 다른 글
트랜잭션 내에서 "GO"사용 (0) | 2021.01.17 |
---|---|
NSError는 어떻게 볼 수 있습니까? (0) | 2021.01.17 |
Android에서 Serializable을 사용하고 있습니까? (0) | 2021.01.17 |
간단한 jQuery, PHP 및 JSONP 예제? (0) | 2021.01.17 |
http://download.eclipse.org/releases/indigo에서 저장소를 읽을 수 없습니다. (0) | 2021.01.17 |