هل يمكن أن يكون نخب Android أطول من Toast.length_long؟

StackOverflow https://stackoverflow.com/questions/2220560

  •  19-09-2019
  •  | 
  •  

سؤال

عند استخدام SetDuration () لنخب، هل من الممكن تعيين طول مخصص أو على الأقل شيء أطول من Toast.LENGTH_LONG?

هل كانت مفيدة؟

المحلول

قيم ذلك LENGTH_SHORT و LENGTH_LONG 0 و 1. هذا يعني أنهم يعاملون كعلامات بدلا من الفوائد الفعلية لذلك لا أعتقد أنه سيكون من الممكن ضبط المدة على أي شيء آخر غير هذه القيم.

إذا كنت ترغب في عرض رسالة للمستخدم لفترة أطول، فكر في إشعار شريط الحالة. وبعد يمكن إلغاء إعلامات شريط الحالة برمجيا عندما لم تعد ذات صلة.

نصائح أخرى

إذا قمت بحفر أعمق في رمز Android، فيمكنك العثور على الخطوط التي تشير بوضوح، إلى أنه لا يمكننا تغيير مدة Toast Message.

 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

قد ترغب في تجربة:

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

لمضاعفة الوقت. إذا قمت بتحديد 3 بدلا من ذلك، فستكون ثلاث مرات ..

أفضل حل لتجنب تأثيرات التلاشي بين النخب الذي تم إطلاقه في التسلسل:

final Toast tag = Toast.makeText(getBaseContext(), "YOUR MESSAGE",Toast.LENGTH_SHORT);

tag.show();

new CountDownTimer(9000, 1000)
{

    public void onTick(long millisUntilFinished) {tag.show();}
    public void onFinish() {tag.show();}

}.start();

هنا يتم عرض نخب حوالي 10 أس.

أتمنى أن يساعدك هذا.

إذا كنت تريد Toast للاستمرار، لقد وجدت أنه يمكنك اختراق طريقك من خلاله Timer يتصل toast.show() مرارا وتكرارا (كل ثانية أو نحو ذلك يجب أن تفعل). دعا show() لا يكسر أي شيء إذا كان Toast يعرض بالفعل، لكنه يقوم بتحديث مقدار الوقت الذي يبقيه على الشاشة.

لقد قمت بتطوير فئة Toast مخصصة التي يمكنك إظهار الخبز المحمص مقابل المدة المطلوبة من المدة (في Milli Minks)

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);
        }
    }
}

لقد ترميز فئة المساعد للقيام بذلك. يمكنك رؤية الكود في 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);

أعلم أنني متأخرة بعض الشيء، لكنني أخذت إجابة 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);

أعرف أن الجواب متأخرا جدا .. كان لدي نفس المشكلة وقررت تنفيذ نسختي الخاصة من نخب العظام العارية، بعد النظر في التعليمات البرمجية المصدر التي تعمل بنظام أندرويد.

أساسا تحتاج إلى إنشاء إدارة نافذة جديدة، وإظهار وإخفاء النافذة لمدة المدة المطلوبة باستخدام معالج

 //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;
        }

الآن كل ما تحتاجه هو إضافة اثنين من مؤشرات الترابط التي تستدعي handleshow () والمعدات المقبض () التي يمكنك نشرها إلى المعالج.

    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);

}

كان هذا تنفيذ سريع وقذرة .. لم تأخذ أي أداء في الاعتبار.

تأخير طويل عرض نخب ل 3.5 ثانية و تأخير قصير عرض نخب ل 2 ثانية.

Toast استخدم داخليا InotificationManager واتصل به طريقة Enqueuetoast في كل مرة يتم استدعاءها toast.show ().

اتصل بالإظهار () مع short_delay مرتين سوف ننفس نفس نخب مرة أخرى. سوف يعرض ل 4 ثانية (2 ثانية + 2 ثانية).

وبالمثل، اتصل بالإظهار () مع Long_Delay مرتين سيوفر نفس النخب مرة أخرى. سوف يعرض ل 7 ثانية (3.5 ثانية + 3.5 ثانية)

فيما يلي فئة Toast مخصصة قمت باستخدام الرمز أعلاه:

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();  
    }
}

إذا كنت بحاجة إلى نخب طويل، فهناك بديل عملي، لكنه يتطلب من المستخدم الخاص بك النقر فوق زر موافق لجعله يذهب بعيدا. يمكنك استخدام 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();

إذا كان لديك رسالة طويلة، فحسب، فأنت لا تعرف كم من الوقت سوف يستغرق لمستخدمك قراءة الرسالة، لذلك من الجيد أحيانا أن تطلب من المستخدم النقر فوق زر موافق للمتابعة. في حالتي، استخدم هذه التقنية عند نقر المستخدم على أيقونة تعليمات.

كما ذكرنا الآخرون أندرو أندرو أندرو أندرين يمكن أن يكونوا طولها أو الطول. لا توجد طريقة حول هذا الأمر، ولا يجب أن تتبع أي من "الاختراقات" المنشورة.

الغرض من الخبز المحمص هو عرض معلومات "غير ضرورية" وبسبب تأثيرها العالق، قد يتم وضع الرسائل بعيدا عن السياق إذا تجاوزت مدةها عتبة معينة. إذا تم تعديل نخب الأسهم حتى يتمكنوا من عرض أطول من الطول، فستتمء الرسالة على الشاشة حتى يتم إنهاء عملية التطبيق، حيث تتم إضافة طرق عرض Toast إلى WindowManager وليس عرض مجموعة في التطبيق الخاص بك. أود أن أفترض أن هذا هو السبب في أنها صلبة مشفرة.

إذا كنت بحاجة تماما لإظهار رسالة نمط نخب أطول من ثلاث ثوان ونصف، أوصي ببناء طريقة عرض تعلق على محتوى النشاط، وبهذه الطريقة سوف تختفي عند خروج المستخدم من التطبيق. لي supertoasts. تتناول Library مع هذه المشكلة والعديد من الآخرين، لا تتردد في استخدامها! من المرجح أن تكون مهتما باستخدام الخماسيالت

ببساطة استخدام supertoast. لجعل نخب أنيق على أي موقف. جعل نخب الخاص بك زاهى الألوان. وبعد تحرير الخاص بك لون الخط وأيضا بحجم. وبعد آمل أن يكون كل شيء في واحد لك.

لماذا تناول الخبز المحمص، عندما يمكنك الحصول على كامل مطعم الوجبات الخفيفة: https:/developer.android.com/Reference/android/support/design/widget/snackbar.html.

Snackbar> نخب، توست مخصص، خطص

فيما يلي طريقة بسيطة للغاية عملت بالنسبة لي:

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

مدة الطول_Short هي 2 ثانية وطول_long 3.5 ثانية، هنا سيتم عرض رسالة Toast 6 ثوان لأنه مغلقة في حلقة. لكن عيب هذه الطريقة هو بعد أن تنشأ كل 2 ثانية تأثير صغير يتلاشى. لكنها ليست ملحوظة كبيرة. آمل أن يكون مفيدا

لا يمكن للمستخدم تحديد مدة Toast. نظرا لأن الدالة ConificationManagerservice ScheduletimeLocked () لا تستخدم مدة الحقل. شفرة المصدر هو ما يلي.

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);
    }

استخدم Crouton، إنها مكتبة نخب مرنة للغاية.

حصص

يمكنك استخدامها تماما مثل الخبز المحمص:

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

أو يمكنك حتى الذهاب إلى أعمق قليلا وتخصيصها أكثر، مثل تحديد الوقت المناسب ل Infinite! على سبيل المثال، أريد أن أظهر رسالة نخب حتى يعترف المستخدم بالنقر فوقه.

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;
}

تخطيط Custome الذي سيتم تضخمه للخبز المحمص.

<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>

نخب مع خلفية مخصصة وجهة نظر فعلت الخدعة بالنسبة لي. لقد اختبرتها في Nexus 7 Tablet ولم ألاحظ أي رسوم متحركة Fadein Fadeout أثناء الحلقات. هيريس التنفيذ:

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 هو جعل نخب بلدي قد تقريب الزاوية كما في نسخة kitkat. يمكنك إضافة طرق عرض أخرى أيضا في الملف. يتم تشجيع أي تعديلات للتحسين والتعليقات كما أخطط لتنفيذ هذا في تطبيق My Live.

جدولة العد التنازلي حتى وقت في المستقبل، مع إخطارات منتظمة على الفواصل الزمنية على طول الطريق. مثال على إظهار العد التنازلي 30 ثانية في حقل نص:

 CountdownTimer } Public Void Onfinish () {mtextfield.setteXt ("تم!")؛ } }.البداية()؛

يمكن اختراق مدة نخب باستخدام مؤشر ترابط يدير الخمور حصريا. هذا يعمل (يدير نخب لمدة 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();

سوف يختفي هذا النص في 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

تحرير: كما قالت ATAI Spector في تعليق أنه سيتم عرضه حوالي 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();

نهج بسيط للغاية لإنشاء رسالة أطول قليلا على النحو التالي:

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);
  }
}

لاحظ أن المثال أعلاه يلغي خيار الطول_SHORT للحفاظ على المثال بسيطا.

لن ترغب بشكل عام في استخدام رسالة Toast لعرض الرسائل لفترة طويلة جدا، لأن هذا ليس الغرض المقصود من فئة Toast. ولكن هناك أوقات يمكن أن تأخذ مقدار النص الذي تحتاجه لعرضه المستخدم أطول من 3.5 ثانية للقراءة، وفي هذه الحالة تمديد بسيط للوقت (على سبيل المثال، إلى 6.5 ثانية، كما هو موضح أعلاه)، يمكن أن يكون IMO، مفيدا ومتسق مع الاستخدام المقصود.

يحدد Toast لفترة محددة في Milli-Secons:

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);
        }
    }
}
  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();
      }

بعد الفشل مع كل حل متاح، كان أخيرا قد حددت باستخدام العودية.

شفرة:

//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);
}

لا، ومعظم معظم الخارقة المدرجة هنا لم تعد تعمل في Android 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();
Toast.makeText(this, "Text", Toast.LENGTH_LONG).show(); 
Toast.makeText(this, "Text", Toast.LENGTH_LONG).show();

حل بسيط للغاية للسؤال. سيكون مرتين أو ثلاثي منهم يجعل نخب يدوم لفترة أطول. إنها الطريقة الوحيدة حولها.

يمكنك ضبط الوقت المطلوب في مللي ثانية في Toast.makeText(); طريقة مثل هذا:

//40 seconds
long mToastLength = 40*1000 
//this toast will be displayed for 40 seconds.
Toast.makeText(this, "Hello!!!!!", mToastLength).show(); 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top