क्या Android टोस्ट Toast.LENGTH_LONG से अधिक लंबा हो सकता है?


263

Toast के लिए setDuration () का उपयोग करते समय, क्या कस्टम लंबाई निर्धारित करना संभव है या कम से कम कुछ अधिक Toast.LENGTH_LONG?


4
@ नोकोला किसी भी कारण से आपने toastटैग हटा दिया ? यह सवाल प्रासंगिक लग रहा है ..
शैडो विजार्ड ईआर फॉर यू

2
@ शादोविगर टैग, मुझे लगता है, उस प्रश्न के विषयों को प्रतिबिंबित करना चाहिए जो व्यापक हित का है। उदाहरण के लिए, यह Android टैग किया गया है और इसलिए एक Android गुरु को यह प्रश्न मिलेगा। टोस्ट इस सवाल को बिल्कुल भी मदद नहीं करता है और एक बेकार टैग की तरह लगता है। यदि टोस्ट एक अच्छा है, क्योंकि सवाल एंड्रॉइड में टैग के बारे में है, तो लंबाई भी एक अच्छा टैग था। हैक, सवाल में हर शब्द एक टैग होना चाहिए ... कोई अनादर नहीं, बस मेरी बात बना रहा है :)
निकु सर्डु

11
मैं करने के लिए toastटैग का उपयोग करें । मुझे लगा कि टैग खोज और छाँटने में मदद करने के लिए थे और toastनिश्चित रूप से एक सामान्य खोज है। androidऔर toastसही लगता है।
क्रिसवेलसन 4

जवाबों:


142

के मूल्यों LENGTH_SHORTऔर LENGTH_LONG0 और 1. इस का मतलब है कि वे बजाय वास्तविक अवधि की तुलना में झंडे के रूप में इलाज कर रहे हैं तो मैं नहीं लगता कि यह इन मूल्यों के अलावा और कुछ करने के लिए अवधि निर्धारित करना संभव हो जाएगा रहे हैं।

यदि आप अधिक समय तक उपयोगकर्ता को संदेश प्रदर्शित करना चाहते हैं, तो स्थिति बार अधिसूचना पर विचार करें । जब वे अब प्रासंगिक नहीं हैं तो स्थिति बार अधिसूचना को प्रोग्राम रद्द किया जा सकता है।


1
स्थिति बार के बारे में सुझाव के लिए धन्यवाद, लेकिन एक कस्टम संवाद गतिविधि के साथ चल रहा है।

337

यदि आप एंड्रॉइड कोड में गहरी खुदाई करते हैं, तो आप उन पंक्तियों को पा सकते हैं जो स्पष्ट रूप से इंगित करती हैं, कि हम टोस्ट संदेश की अवधि को बदल नहीं सकते हैं।

 NotificationManagerService.scheduleTimeoutLocked() {
    ...
    long delay = immediate ? 0 : (r.duration == Toast.LENGTH_LONG ? LONG_DELAY : SHORT_DELAY);
    }

और अवधि के लिए डिफ़ॉल्ट मान हैं

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

4
धन्यवाद ... यह वास्तव में मुझे क्या चाहिए था।
मर्मर

3
डिफ़ॉल्ट मान पोस्ट करने के लिए धन्यवाद! मुझे डर था कि मैं उन्हें ढूंढ नहीं पाऊंगा।
Amplify91

1
मैं डिफ़ॉल्ट टोस्ट मूल्यों के लिए भी देख रहा था, यह पहली हिट थी। निश्चित रूप से उत्थान। धन्यवाद!
डेव

120

आप कोशिश कर सकते हैं:

for (int i=0; i < 2; i++)
{
      Toast.makeText(this, "blah", Toast.LENGTH_LONG).show();
}

समय दोगुना करने के लिए। यदि आप 3 को 2 के बजाय निर्दिष्ट करते हैं तो यह समय को तीन गुना कर देगा..सीटीसी।


17
संदेश पलक :(
डेनिज़

61
यह समाधान खराब है, क्योंकि, यदि आप टोस्ट के समय से पहले गतिविधि छोड़ देते हैं, तो यह पलक
झपकते ही

@dwbrito: पूरी तरह से सहमत हैं और इसलिए -1
फहीम पारकर

[+1] उत्तर के लिए .... Toast.cancel()उपयुक्त स्थानों में उपयोग करके टोस्ट को रद्द किया जा सकता है
देवरथ

1
हाँ, इसे लागू किया जा सकता है, लेकिन टोस्ट पलक
झपकते

31

यदि आप Toastलगातार बने रहना चाहते हैं, तो मैंने पाया कि आप बार-बार Timerकॉल करके toast.show()(इसके बाद हर सेकंड ऐसा कर सकते हैं) अपना रास्ता हैक कर सकते हैं । कॉलिंग show()कुछ भी नहीं तोड़ती है अगर Toastपहले से ही दिखा रहा है, लेकिन यह स्क्रीन पर रहने की मात्रा को ताज़ा करता है।


3
इसके साथ समस्या यह है कि यदि उपयोगकर्ता स्क्रीन को छूता है तो टोस्ट एंड्रॉइड द्वारा छिपाया जाएगा लेकिन फिर टाइमर द्वारा पुनः बनाया जाएगा।
वायलेट जिराफ

2
@VioletGiraffe अपने ViewGroup OnTouchईवेंट में बूलियन ध्वज की तरह कुछ के साथ संभाल करने के लिए बहुत तुच्छ है । इस अनुकूलन करने के लिए आप शायद वास्तविक समय के करीब के रूप में अपने टाइमर दोहराने बनाना चाहिए Toastस्क्रीन पर दिखाया जाता (लंबे समय के लिए 3.5 सेकंड, छोटे के लिए 2 सेकंड)
syklon

18

मैंने एक कस्टम टोस्ट वर्ग विकसित किया है जिसके साथ आप टोस्ट को वांछित अवधि (मिल्ली सेकंड में) के लिए दिखा सकते हैं

import android.content.Context;
import android.os.Build;
import android.os.Handler;
import android.util.Log;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import android.widget.TextView;

public final class ToastHelper {

    private static final String TAG = ToastHelper.class.getName();

    public static interface OnShowListener {
        public void onShow(ToastHelper toast);
    }

    public static interface OnDismissListener {
        public void onDismiss(ToastHelper toast);
    }

    private static final int WIDTH_PADDING_IN_DIP = 25;
    private static final int HEIGHT_PADDING_IN_DIP = 15;
    private static final long DEFAULT_DURATION_MILLIS = 2000L;

    private final Context context;
    private final WindowManager windowManager;
    private View toastView;

    private int gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
    private int mX;
    private int mY;
    private long duration = DEFAULT_DURATION_MILLIS;
    private CharSequence text = "";
    private int horizontalMargin;
    private int verticalMargin;
    private WindowManager.LayoutParams params;
    private Handler handler;
    private boolean isShowing;
    private boolean leadingInfinite;

    private OnShowListener onShowListener;
    private OnDismissListener onDismissListener;

    private final Runnable timer = new Runnable() {

        @Override
        public void run() {
            cancel();
        }
    };

    public ToastHelper(Context context) {
        Context mContext = context.getApplicationContext();
        if (mContext == null) {
            mContext = context;
        }
        this.context = mContext;
        windowManager = (WindowManager) mContext
                .getSystemService(Context.WINDOW_SERVICE);
        init();
    }

    private void init() {
        mY = context.getResources().getDisplayMetrics().widthPixels / 5;
        params = new WindowManager.LayoutParams();
        params.height = WindowManager.LayoutParams.WRAP_CONTENT;
        params.width = WindowManager.LayoutParams.WRAP_CONTENT;
        params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
        params.format = android.graphics.PixelFormat.TRANSLUCENT;
        params.type = WindowManager.LayoutParams.TYPE_TOAST;
        params.setTitle("ToastHelper");
        params.alpha = 1.0f;
        // params.buttonBrightness = 1.0f;
        params.packageName = context.getPackageName();
        params.windowAnimations = android.R.style.Animation_Toast;
    }

    @SuppressWarnings("deprecation")
    @android.annotation.TargetApi(Build.VERSION_CODES.JELLY_BEAN)
    private View getDefaultToastView() {
        TextView textView = new TextView(context);
        textView.setText(text);
        textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.START);
        textView.setClickable(false);
        textView.setFocusable(false);
        textView.setFocusableInTouchMode(false);
        textView.setTextColor(android.graphics.Color.WHITE);
        // textView.setBackgroundColor(Color.BLACK);
        android.graphics.drawable.Drawable drawable = context.getResources()
                .getDrawable(android.R.drawable.toast_frame);
        if (Build.VERSION.SDK_INT < 16) {
            textView.setBackgroundDrawable(drawable);
        } else {
            textView.setBackground(drawable);
        }
        int wP = getPixFromDip(context, WIDTH_PADDING_IN_DIP);
        int hP = getPixFromDip(context, HEIGHT_PADDING_IN_DIP);
        textView.setPadding(wP, hP, wP, hP);
        return textView;
    }

    private static int getPixFromDip(Context context, int dip) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
                dip, context.getResources().getDisplayMetrics());
    }

    public void cancel() {
        removeView(true);
    }

    private void removeView(boolean invokeListener) {
        if (toastView != null && toastView.getParent() != null) {
            try {
                Log.i(TAG, "Cancelling Toast...");
                windowManager.removeView(toastView);
                handler.removeCallbacks(timer);
            } finally {
                isShowing = false;
                if (onDismissListener != null && invokeListener) {
                    onDismissListener.onDismiss(this);
                }
            }
        }
    }

    public void show() {
        if (leadingInfinite) {
            throw new InfiniteLoopException(
                    "Calling show() in OnShowListener leads to infinite loop.");
        }
        cancel();
        if (onShowListener != null) {
            leadingInfinite = true;
            onShowListener.onShow(this);
            leadingInfinite = false;
        }
        if (toastView == null) {
            toastView = getDefaultToastView();
        }
        params.gravity = android.support.v4.view.GravityCompat
                .getAbsoluteGravity(gravity, android.support.v4.view.ViewCompat
                        .getLayoutDirection(toastView));
        if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == Gravity.FILL_HORIZONTAL) {
            params.horizontalWeight = 1.0f;
        }
        if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == Gravity.FILL_VERTICAL) {
            params.verticalWeight = 1.0f;
        }
        params.x = mX;
        params.y = mY;
        params.verticalMargin = verticalMargin;
        params.horizontalMargin = horizontalMargin;

        removeView(false);
        windowManager.addView(toastView, params);
        isShowing = true;
        if (handler == null) {
            handler = new Handler();
        }
        handler.postDelayed(timer, duration);
    }

    public boolean isShowing() {
        return isShowing;
    }

    public void setDuration(long durationMillis) {
        this.duration = durationMillis;
    }

    public void setView(View view) {
        removeView(false);
        toastView = view;
    }

    public void setText(CharSequence text) {
        this.text = text;
    }

    public void setText(int resId) {
        text = context.getString(resId);
    }

    public void setGravity(int gravity, int xOffset, int yOffset) {
        this.gravity = gravity;
        mX = xOffset;
        mY = yOffset;
    }

    public void setMargin(int horizontalMargin, int verticalMargin) {
        this.horizontalMargin = horizontalMargin;
        this.verticalMargin = verticalMargin;
    }

    public long getDuration() {
        return duration;
    }

    public int getGravity() {
        return gravity;
    }

    public int getHorizontalMargin() {
        return horizontalMargin;
    }

    public int getVerticalMargin() {
        return verticalMargin;
    }

    public int getXOffset() {
        return mX;
    }

    public int getYOffset() {
        return mY;
    }

    public View getView() {
        return toastView;
    }

    public void setOnShowListener(OnShowListener onShowListener) {
        this.onShowListener = onShowListener;
    }

    public void setOnDismissListener(OnDismissListener onDismissListener) {
        this.onDismissListener = onDismissListener;
    }

    public static ToastHelper makeText(Context context, CharSequence text,
            long durationMillis) {
        ToastHelper helper = new ToastHelper(context);
        helper.setText(text);
        helper.setDuration(durationMillis);
        return helper;
    }

    public static ToastHelper makeText(Context context, int resId,
            long durationMillis) {
        String string = context.getString(resId);
        return makeText(context, string, durationMillis);
    }

    public static ToastHelper makeText(Context context, CharSequence text) {
        return makeText(context, text, DEFAULT_DURATION_MILLIS);
    }

    public static ToastHelper makeText(Context context, int resId) {
        return makeText(context, resId, DEFAULT_DURATION_MILLIS);
    }

    public static void showToast(Context context, CharSequence text) {
        makeText(context, text, DEFAULT_DURATION_MILLIS).show();
    }

    public static void showToast(Context context, int resId) {
        makeText(context, resId, DEFAULT_DURATION_MILLIS).show();
    }

    private static class InfiniteLoopException extends RuntimeException {
        private static final long serialVersionUID = 6176352792639864360L;

        private InfiniteLoopException(String msg) {
            super(msg);
        }
    }
}

android.view.WindowManager $ BadTokenException: विंडो जोड़ने में असमर्थ - टोकन नल मान्य नहीं है; क्या आपकी गतिविधि चल रही है?
अहमदुल्लाह सैकत

13

मैंने ऐसा करने के लिए एक सहायक वर्ग को कोडित किया है। आप github पर कोड देख सकते हैं: https://github.com/quiqueqs/Toast-Expander/blob/master/src/com/thirtymatches/toasted/ToastedActivity.java

इस तरह आप 5 सेकंड (या 5000 मिलीसेकंड) के लिए एक टोस्ट प्रदर्शित करेंगे:

Toast aToast = Toast.makeText(this, "Hello World", Toast.LENGTH_SHORT);
ToastExpander.showFor(aToast, 5000);

Thx और Nice लेकिन हम उदाहरण के लिए onDestroy थ्रेड को कैसे रोक सकते हैं? मैंने ऐसा करने की कोशिश की है, लेकिन निश्चित नहीं है: सार्वजनिक स्थैतिक शून्य रद्द (टोस्ट मायटोस्ट) {अगर (null! = T) t.stop (); mytoast.cancel (); }
सींगटबज

10

मुझे पता है कि मुझे थोड़ी देर हो गई है, लेकिन मैंने Regis_AG का जवाब लिया और इसे एक सहायक वर्ग में लपेट दिया और यह बहुत अच्छा काम करता है।

public class Toaster {
  private static final int SHORT_TOAST_DURATION = 2000;

  private Toaster() {}

  public static void makeLongToast(String text, long durationInMillis) {
    final Toast t = Toast.makeText(App.context(), text, Toast.LENGTH_SHORT);
    t.setGravity(Gravity.TOP | Gravity.CENTER_HORIZONTAL, 0, 0);

    new CountDownTimer(Math.max(durationInMillis - SHORT_TOAST_DURATION, 1000), 1000) {
      @Override
      public void onFinish() {
        t.show();
      }

      @Override
      public void onTick(long millisUntilFinished) {
        t.show();
      }
    }.start();
  }
}

आपके एप्लिकेशन कोड में, बस कुछ इस तरह से करें:

    Toaster.makeLongToast("Toasty!", 8000);

यह वास्तव में काम करता है! लेकिन आप इसे कैसे अनुकूलन योग्य और सहज बना सकते हैं?
Android डेवलपर

इस नौसिखिया प्रश्न के लिए क्षमा करें, लेकिन जब मैं उपरोक्त टोस्टर वर्ग बनाता हूं, तो यह कहता है कि यह लाइन में प्रतीक 'ऐप' को हल नहीं कर सकता है। फ़ाइनल टोस्ट t = Toast.makeText (App.context (), text, Toast.LENGTH_SHORT); धन्यवाद, और माफी।
ब्रायन फ्लेमिंग

उसके लिए माफ़ कीजिये! App.context () मूल रूप से कस्टम कोड का एक टुकड़ा है जिसे मैंने ApplicationContext को कहीं से भी बिना पास किए आसानी से एक्सेस करने के लिए लिखा था। आप कई चीजों के लिए एक पैटर्न का उपयोग नहीं करेंगे, लेकिन मैंने पाया कि यह ApplicationContext के लिए मायने रखता है। आप इस स्निपेट को एक तर्क के रूप में ApplicationContext को विधि में पारित करना चाहते हैं।
क्रिस एचीसन

9

मुझे पता है कि उत्तर काफी देर से है .. मेरे पास एक ही मुद्दा था और टोस्ट के लिए एंड्रॉइड के स्रोत कोड को देखने के बाद, नंगे हड्डियों टोस्ट के अपने संस्करण को लागू करने का फैसला किया।

मूल रूप से आपको एक नया विंडो प्रबंधक बनाने की जरूरत है, और एक हैंडलर का उपयोग करके वांछित अवधि के लिए विंडो को दिखाना और छिपाना है

 //Create your handler
 Handler mHandler = new Handler();

//Custom Toast Layout
mLayout = layoutInflater.inflate(R.layout.customtoast, null);

//Initialisation 

mWindowManager = (WindowManager) context.getApplicationContext()
            .getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams();

params.gravity = Gravity.BOTTOM
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE
                | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
params.format = PixelFormat.TRANSLUCENT;
params.windowAnimations = android.R.style.Animation_Toast;
params.type = WindowManager.LayoutParams.TYPE_TOAST;

लेआउट के आरंभीकरण के बाद आप अपने खुद के छिपाने और दिखाने के तरीकों का उपयोग कर सकते हैं

    public void handleShow() {
    mWindowManager.addView(mLayout, mParams);
    }

    public void handleHide() {
        if (mLayout != null) {
            if (mLayout.getParent() != null) {
                mWindowManager.removeView(mLayout);
            }
                         mLayout = null;
        }

अब आपको केवल दो रन करने योग्य थ्रेड्स को जोड़ना है जो हैंडशू () और हैंडलहाइड () को कॉल करता है जिसे आप हैंडलर को पोस्ट कर सकते हैं।

    Runnable toastShowRunnable = new Runnable() {
        public void run() {
            handleShow();
        }
    };

 Runnable toastHideRunnable = new Runnable() {
        public void run() {
            handleHide();
        }
    }; 

और अंतिम भाग

public void show() {

    mHandler.post(toastShowRunnable);
    //The duration that you want
    mHandler.postDelayed(toastHideRunnable, mDuration);

}

यह एक त्वरित और गंदा कार्यान्वयन था .. किसी भी प्रदर्शन को ध्यान में नहीं रखा।


1
मैंने इसे चलाने की कोशिश की (जिसमें "शो ()" के लिए कॉल भी शामिल है) लेकिन कुछ भी नहीं दिखाई देता (एंड्रॉइड 7.1 पर परीक्षण किया गया)। मुझे लगता है कि आप कुछ याद करते हैं। इसके अलावा, यहां वह हिस्सा कहां है जो दृश्य को हटाने से रोकता है, क्योंकि थोड़े समय के बाद एक टोस्ट गायब हो जाता है?
Android डेवलपर

8

LONG_DELAY के लिए प्रदर्शन टोस्ट 3.5 सेकंड और SHORT_DELAY के लिए प्रदर्शन टोस्ट 2 सेकंड

टोस्ट आंतरिक रूप से INotificationManager का उपयोग करता है और कॉल करता है कि यह एक टोस्ट विधि है जिसे हर बार Toast.show () कहा जाता है।

शो को कॉल करें () SHORT_DELAY के साथ दो बार फिर से उसी टोस्ट को एंक्वाय करें। यह 4 सेकंड (2 सेकंड + 2 सेकंड) के लिए प्रदर्शित होगा ।

इसी तरह, LONG_DELAY के साथ शो को कॉल करें () दो बार फिर से एक ही टोस्ट को लागू करेगा। यह 7 सेकंड (3.5 सेकंड + 3.5 सेकंड) के लिए प्रदर्शित होगा


6

यहाँ एक कस्टम टोस्ट क्लास है जो मैंने उपरोक्त कोड का उपयोग करके बनाया है:

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

public class CustomToast extends Toast {
    int mDuration;
    boolean mShowing = false;
    public CustomToast(Context context) {
        super(context);
        mDuration = 2;
    }


    /**
     * Set the time to show the toast for (in seconds) 
     * @param seconds Seconds to display the toast
     */
    @Override
    public void setDuration(int seconds) {
        super.setDuration(LENGTH_SHORT);
        if(seconds < 2) seconds = 2; //Minimum
        mDuration = seconds;
    }

    /**
     * Show the toast for the given time 
     */
    @Override
    public void show() {
        super.show();

        if(mShowing) return;

        mShowing = true;
        final Toast thisToast = this;
        new CountDownTimer((mDuration-2)*1000, 1000)
        {
            public void onTick(long millisUntilFinished) {thisToast.show();}
            public void onFinish() {thisToast.show(); mShowing = false;}

        }.start();  
    }
}

5

यदि आपको एक लंबी टोस्ट की आवश्यकता है, तो एक व्यावहारिक विकल्प है, लेकिन इसे दूर जाने के लिए आपके उपयोगकर्ता को ओके बटन पर क्लिक करना होगा। आप इस तरह से एक AlertDialog का उपयोग कर सकते हैं:

String message = "This is your message";
new AlertDialog.Builder(YourActivityName.this)
    .setTitle("Optional Title (you can omit this)")
    .setMessage(message)
    .setPositiveButton("ok", null)
    .show();

यदि आपके पास एक लंबा संदेश है, तो संभावना है, आप नहीं जानते कि आपके उपयोगकर्ता को संदेश पढ़ने में कितना समय लगेगा, इसलिए कभी-कभी अपने उपयोगकर्ता को जारी रखने के लिए ओके बटन पर क्लिक करने की आवश्यकता होती है। मेरे मामले में, मैं इस तकनीक का उपयोग तब करता हूं जब कोई उपयोगकर्ता सहायता आइकन पर क्लिक करता है।


1
यह स्मार्ट है, लेकिन इसे कुछ ऐसे में लागू नहीं किया जा सकता है Service, जहां UI नहीं है।
माइक ४47

@mikejeep वास्तव में, मैंने हाल ही में Google द्वारा एक उदाहरण देखा है, जिसमें एक गतिविधि के बिना एक संवाद दिखाया गया है: developer.android.com/samples/AppShortcuts/index.html
Android डेवलपर

5

जैसा कि दूसरों ने बताया है कि एंड्रॉइड टोस्ट या तो LENGTH_LONG या LENGTH_SHORT हो सकते हैं। इसके आसपास कोई रास्ता नहीं है, और न ही आपको पोस्ट किए गए किसी भी 'हैक' का पालन करना चाहिए।

टोट्स का उद्देश्य "गैर-आवश्यक" जानकारी प्रदर्शित करना है और उनके प्रभाव के कारण, संदेश को संदर्भ से बहुत दूर रखा जा सकता है यदि उनकी अवधि एक निश्चित सीमा से अधिक हो। यदि स्टॉक टोस्ट्स को संशोधित किया गया था ताकि वे LENGTH_LONG से अधिक समय तक प्रदर्शित हो सकें, तो संदेश स्क्रीन पर तब तक दिखाई देगा जब तक कि एप्लिकेशन की प्रक्रिया समाप्त नहीं हो जाती क्योंकि टोस्ट व्यू को WindowManager में जोड़ा जाता है और आपके ऐप में ViewGroup नहीं। मुझे लगता है यही कारण है कि यह कठिन कोडित है।

अगर आपको बिल्कुल साढ़े तीन सेकंड से ज्यादा का टोस्ट स्टाइल मेसेज दिखाने की जरूरत है तो मैं एक ऐसा व्यू बनाने की सलाह देता हूं, जो एक्टिविटी के कंटेंट से जुड़ जाए, इस तरह यह तब गायब हो जाएगा जब यूजर एप्लिकेशन से बाहर निकल जाएगा। मेरा SuperToasts पुस्तकालय इस मुद्दे और कई अन्य लोगों के साथ व्यवहार करता है, इसका उपयोग करने के लिए स्वतंत्र महसूस करें! सुपरअक्टिविटीटोट्स का उपयोग करने में आपकी सबसे अधिक रुचि होगी


4

किसी भी स्थिति पर एक सुरुचिपूर्ण टोस्ट बनाने के लिए बस सुपरटैस्ट का उपयोग करें । अपने टोस्ट को रंगीन बनाएं । अपने फ़ॉन्ट रंग को संपादित करें और यह भी आकार है । आशा है कि यह सब आपके लिए एक होगा।



3

यहाँ एक बहुत ही सरल विधि है जो मेरे लिए काम करती है:

for (int i=0; i < 3; i++) { Toast.makeText(this, "MESSAGE", Toast.LENGTH_SHORT).show(); }

LENGTH_SHORT की अवधि 2 सेकंड है और LENGTH_LONG 3.5 सेकंड है, यहां टोस्ट संदेश 6 सेकंड के लिए दिखाया जाएगा क्योंकि यह लूप के लिए संलग्न है। लेकिन इस विधि का एक दोष यह है कि प्रत्येक 2 सेकंड के बाद एक छोटा सा लुप्त होती प्रभाव उत्पन्न हो सकता है। लेकिन यह अधिक ध्यान देने योग्य नहीं है। आशा है कि यह मददगार है


2

उपयोगकर्ता टोस्ट की अवधि को परिभाषित नहीं कर सकता है। क्योंकि NotificationManagerService का शेड्यूल टाइमआउट () फ़ंक्शन फ़ील्ड अवधि का उपयोग नहीं करता है। स्रोत कोड निम्नलिखित है।

private void scheduleTimeoutLocked(ToastRecord r, boolean immediate)
    {
        Message m = Message.obtain(mHandler, MESSAGE_TIMEOUT, r);
        long delay = immediate ? 0 : (r.duration == Toast.LENGTH_LONG ? LONG_DELAY : SHORT_DELAY);
        mHandler.removeCallbacksAndMessages(r);
        mHandler.sendMessageDelayed(m, delay);
    }

2

क्राउटन का उपयोग करें, यह एक बहुत ही लचीली टोस्ट लाइब्रेरी है।

crouton

आप इसे विस्फोट की तरह उपयोग कर सकते हैं:

Crouton.makeText(context, "YOUR_MESSAGE", Style.INFO);

या आप थोड़ी गहराई में जा सकते हैं और इसे और अधिक कस्टमाइज़ कर सकते हैं, जैसे अनंत को समय निर्धारित करना! उदाहरण के लिए यहां मैं एक टोस्ट संदेश दिखाना चाहता हूं जब तक कि उपयोगकर्ता उस पर क्लिक करके उसे स्वीकार नहीं करता।

private static void showMessage(final Activity context, MessageType type, String header, String message) {
    View v = context.getLayoutInflater().inflate(R.layout.toast_layout, null);
    TextView headerTv = (TextView) v.findViewById(R.id.toastHeader);
    headerTv.setText(header);
    TextView messageTv = (TextView) v.findViewById(R.id.toastMessage);
    messageTv.setText(message);
    ImageView toastIcon = (ImageView) v.findViewById(R.id.toastIcon);

    final Crouton crouton = getCrouton(context, v);
    v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Crouton.hide(crouton);
        }
    });

    crouton.show();
}

private static Crouton getCrouton(final Activity context, View v) {
    Crouton crouton = Crouton.make(context, v);
    crouton.setConfiguration(new Configuration.Builder().setDuration(Configuration.DURATION_INFINITE).build());
    return crouton;
}

कस्टोम लेआउट जिसे टोस्ट के लिए फुलाया जाएगा।

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:background="@drawable/shadow_container"
    android:gravity="center_vertical"
    android:orientation="horizontal"
    android:padding="@dimen/default_margin"
    tools:ignore="Overdraw">

    <ImageView
        android:id="@+id/toastIcon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginStart="@dimen/default_spacing_full"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:id="@+id/toastHeader"
            style="@style/ItemText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/toastMessage"
            style="@style/ItemSubText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

    </LinearLayout>

</LinearLayout>

2

टोस्ट अवधि को एक थ्रेड का उपयोग करके हैक किया जा सकता है जो टोस्ट को विशेष रूप से चलाता है। यह काम करता है (10 सेकेंड, संशोधित करने के लिए टोस्ट चलाता है नींद और सीटीआर अपनी पसंद के अनुसार):

final Toast toast = Toast.makeText(this, "Your Message", Toast.LENGTH_LONG);

Thread t = new Thread(){
    public void run(){
          int ctr = 0;
          try{
               while( ctr<10 ){
                    toast.show();
                    sleep(1000);
                    ctr++;
               }
          } catch (Exception e) {
               Log.e("Error", "", e);
          }
     }
 };
 t.start();

1

कस्टम पृष्ठभूमि और दृश्य के साथ एक टोस्ट ने मेरे लिए चाल चली। मैंने इसे नेक्सस 7 टैबलेट में परीक्षण किया और मैंने देखा कि लूपिंग के दौरान कोई फेडिन फेडेड एनीमेशन नहीं है। कार्यान्वयन को पूरा करता है:

public static void customToast(Context context, String message, int duration) {

    for (int i = 0; i < duration; i++) {
        Toast toast = new Toast(context);
        toast.setDuration(Toast.LENGTH_LONG);
        toast.setGravity(Gravity.CENTER, 0, 0);
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = inflater.inflate(R.layout.toast_layout, null);
        TextView textViewToast = (TextView) view
                .findViewById(R.id.textViewToast);
        textViewToast.setText(message);
        toast.setView(view);
        toast.show();
    }

}

उपरोक्त कोड में उपयोग किए गए कस्टम टेक्स्टव्यू का उपयोग करता है:

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/textViewToast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/fragment_background"
android:padding="8dp"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="@color/blue" />

@ drawable / fragment_background मेरे टोस्ट को किटकैट संस्करण के रूप में गोल कोने में बना रहा है। आप फ़ाइल में अन्य विचार भी जोड़ सकते हैं। सुधार और टिप्पणियों के लिए किसी भी संशोधन को प्रोत्साहित किया जाता है क्योंकि मैं अपने लाइव ऐप में इसे लागू करने की योजना बना रहा हूं।


1

भविष्य में एक समय तक उलटी गिनती का समय निर्धारित करें, रास्ते में अंतराल पर नियमित सूचनाओं के साथ। पाठ क्षेत्र में 30 सेकंड की उलटी गिनती दिखाने का उदाहरण:

     न्यू काउंटडाउनटीमर (30000, 1000) {

     सार्वजनिक शून्य onTick (लंबी मिलीसेन्फिल्ड) {
         mTextField.setText ("सेकंड शेष:" + millisUntilFinished / 1000);
     }

     सार्वजनिक शून्य चालू () {
         mTextField.setText ( "किया है!");
     }
  }।शुरू();



1

यह पाठ 5 सेकंड में गायब हो जाएगा।

    final Toast toast = Toast.makeText(getApplicationContext(), "My Text", Toast.LENGTH_SHORT);
    toast.show();

    Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
           @Override
           public void run() {
               toast.cancel(); 
           }
    }, 5000); // Change to what you want

संपादित करें: जैसा कि इताई स्पेक्टर ने टिप्पणी में कहा है कि यह लगभग 3.5 सेकंड में दिखाया जाएगा, इसलिए इस कोड का उपयोग करें:

    int toastDuration = 5000; // in MilliSeconds
    Toast mToast = Toast.makeText(this, "My text", Toast.LENGTH_LONG);
    CountDownTimer countDownTimer;
    countDownTimer = new CountDownTimer(toastDuration, 1000) {
        public void onTick(long millisUntilFinished) {
            mToast.show();
        }

        public void onFinish() {
            mToast.cancel();
        }
    };

    mToast.show();
    countDownTimer.start();

मुझे लगता है कि यह पाठ 3.5 सेकंड के बाद गायब हो जाएगा
इटाई स्पेक्टर

@ इटाइसेक्टर: कृपया मेरा नया कोड जांचें।
एलिरेज़ा नूराली

1

नहीं, और अधिकांश / सभी यहाँ सूचीबद्ध हैक अब एंड्रॉइड 9 में काम नहीं करते हैं। लेकिन एक बेहतर समाधान है: यदि आपको संदेश चारों ओर घूमना है, तो संवाद बॉक्स का उपयोग करें।

(new AlertDialog.Builder(this)).setTitle("Sorry!")
.setMessage("Please let me know by posting a beta comment on the play store .")
.setPositiveButton("OK", null).create().show();

हालांकि यह जवाब नहीं है कि हुसैन की तलाश थी, यह उन सभी 'हैक' से बेहतर विकल्प है!
डैनी ईके वैन डेर कोल

0

एक बहुत लंबा संदेश बनाने के लिए एक बहुत ही सरल तरीका इस प्रकार है:

private Toast myToast;

public MyView(Context context) {
  myToast = Toast.makeText(getContext(), "", Toast.LENGTH_LONG);
}

private Runnable extendStatusMessageLengthRunnable = new Runnable() {
  @Override
    public void run() {
    //Show the toast for another interval.
    myToast.show();
   }
}; 

public void displayMyToast(final String statusMessage, boolean extraLongDuration) {
  removeCallbacks(extendStatusMessageLengthRunnable);

  myToast.setText(statusMessage);
  myToast.show();

  if(extraLongDuration) {
    postDelayed(extendStatusMessageLengthRunnable, 3000L);
  }
}

ध्यान दें कि उपरोक्त उदाहरण उदाहरण को सरल रखने के लिए LENGTH_SHORT विकल्प को समाप्त कर देता है।

आप आम तौर पर बहुत लंबे अंतराल के लिए संदेश प्रदर्शित करने के लिए टोस्ट संदेश का उपयोग नहीं करना चाहेंगे, क्योंकि यह टोस्ट वर्ग का उद्देश्य नहीं है। लेकिन ऐसे समय होते हैं जब आपके द्वारा प्रदर्शित पाठ की मात्रा को उपयोगकर्ता को पढ़ने में 3.5 सेकंड से अधिक समय लग सकता है, और उस स्थिति में समय का थोड़ा विस्तार (जैसे, 6.5 सेकंड, जैसा कि ऊपर दिखाया गया है), IMO, उपयोगी हो सकता है और इच्छित उपयोग के अनुरूप है।


0

मिलि-सेकंड में एक विशिष्ट अवधि के लिए टोस्ट सेट करें:

public void toast(int millisec, String msg) {
    Handler handler = null;
    final Toast[] toasts = new Toast[1];
    for(int i = 0; i < millisec; i+=2000) {
        toasts[0] = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
        toasts[0].show();
        if(handler == null) {
            handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    toasts[0].cancel();
                }
            }, millisec);
        }
    }
}

0
  private Toast mToastToShow;
  public void showToast(View view) {
 // Set the toast and duration
 int toastDurationInMilliSeconds = 10000;
 mToastToShow = Toast.makeText(this, "Hello world, I am a toast.",  Toast.LENGTH_LONG);

 // Set the countdown to display the toast
 CountDownTimer toastCountDown;
 toastCountDown = new CountDownTimer(toastDurationInMilliSeconds, 1000 /*Tick duration*/) {
  public void onTick(long millisUntilFinished) {
     mToastToShow.show();
  }
  public void onFinish() {
     mToastToShow.cancel();
     }
    };

    // Show the toast and starts the countdown
     mToastToShow.show();
     toastCountDown.start();
      }

0

हर उपलब्ध समाधान के साथ असफल होने के बाद, मैंने आखिरकार पुनरावृत्ति का उपयोग करके समाधान किया था।

कोड:

//Recursive function, pass duration in seconds
public void showToast(int duration) {
    if (duration <= 0)
        return;

    Toast.makeText(this, "Hello, it's a toast", Toast.LENGTH_LONG).show();
    Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            showToast(duration-1);
        }
    }, 1000);
}

2
टोस्ट को प्रदर्शित करने के लिए "शो" को बार-बार कॉल करने से संबंधित इस प्रश्न के अधिकांश समाधान समान टोस्ट उदाहरण के साथ कर रहे हैं, जबकि आपका वास्तव में हर सेकंड एक नया टोस्ट उदाहरण बना रहा है और यह निर्दिष्ट कर रहा है कि प्रत्येक को लोंग के लिए दिखाया जाना चाहिए। अवधि (सामान्य रूप से 3.5 सेकंड)। न केवल यह अक्षम है क्योंकि आप अतिरिक्त ऑब्जेक्ट इंस्टेंस बनाते रहते हैं, बल्कि एंड्रॉइड टोस्ट संदेशों को एक कतार में भी डालते हैं, जो उनकी निर्दिष्ट अवधि के लिए एक के बाद एक दिखाए जाते हैं। इसलिए यदि आप इसे 5 की अवधि के साथ कहते हैं, तो संदेश वास्तव में 17.5 सेकंड के लिए दिखाई देगा।
०४

-1
Toast.makeText(this, "Text", Toast.LENGTH_LONG).show(); 
Toast.makeText(this, "Text", Toast.LENGTH_LONG).show();

प्रश्न का एक बहुत ही सरल समाधान। दो बार या उनमें से ट्रिपल टोस्ट पिछले लंबे समय तक कर देगा। यह एकमात्र रास्ता है।


हालांकि लगता है हैक, लेकिन सोच की सराहना!
6:45 बजे सोनी कदवन

क्यों नीचे @Aurouro द्वारा उल्लिखित एक समान समाधान को लूप के साथ प्रयोग किया जाता है
जर्जर

इस दृष्टिकोण ने मेरे लिए काम किया। उन लोगों से सुनना अच्छा होगा जिन्होंने नीचे वोट दिया था कि उन्होंने ऐसा क्यों किया।
क्रिस्टोफर मिल्स

-8

आप Toast.makeText();इस तरह से विधि में मिलीसेकंड में वांछित समय निर्धारित कर सकते हैं :

//40 seconds
long mToastLength = 40*1000 
//this toast will be displayed for 40 seconds.
Toast.makeText(this, "Hello!!!!!", mToastLength).show(); 

1
जवाब सही है! LENGTH_LONG या LENGTH_SHORT के अलावा किसी अन्य मान का उपयोग करने की अनुमति देने के लिए API को कुछ समय में बढ़ाया गया था। मैं
rts

मुझे ऐसा नहीं लगता। को देखो android.googlesource.com/platform/frameworks/base/+/...
AntiCZ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.