Android Toast นั้นยาวกว่า Toast หรือไม่ LENGTH_LONG


263

เมื่อใช้ setDuration () สำหรับขนมปังปิ้งเป็นไปได้ไหมที่จะกำหนดความยาวที่กำหนดเองหรืออย่างน้อยก็นานกว่านั้นToast.LENGTH_LONG?


4
@Nicolae ด้วยเหตุผลใดก็ตามที่คุณลบtoastแท็ก ดูเหมือนว่าจะเกี่ยวข้องกับคำถาม ..
Shadow Wizard คือ Ear For You

2
@ShadowWizard แท็กที่ดูเหมือนกับฉันควรสะท้อนถึงหัวข้อของคำถามที่น่าสนใจในวงกว้าง ตัวอย่างเช่นมันติดแท็ก android และกูรู android จะพบคำถามนี้ ขนมปังปิ้งไม่ได้ช่วยคำถามนี้เลยและดูเหมือนแท็กที่ไร้ประโยชน์ ถ้าขนมปังปิ้งเป็นสิ่งที่ดีเพราะคำถามเกี่ยวกับแท็กใน Android แล้วความยาวก็เป็นแท็กที่ดี สับคำในคำถามที่ทุกคนควรจะเป็นแท็ก ... ไม่มีดูหมิ่นเพียงแค่การทำจุดของฉัน :)
Nicu Surdu

11
ฉันใช้toastแท็กไป ฉันคิดว่าแท็กอยู่ที่นั่นเพื่อช่วยในการค้นหาและจัดเรียงและtoastเป็นการค้นหาทั่วไปอย่างแน่นอน androidและtoastดูสมบูรณ์แบบ
ChrisWilson4

คำตอบ:


142

ค่าของLENGTH_SHORTและLENGTH_LONGเป็น 0 และ 1 ซึ่งหมายความว่าพวกเขาจะถือว่าเป็นค่าสถานะมากกว่าระยะเวลาจริงดังนั้นฉันไม่คิดว่ามันจะเป็นไปได้ที่จะกำหนดระยะเวลาให้กับสิ่งอื่นนอกเหนือจากค่าเหล่านี้

หากคุณต้องการที่จะแสดงข้อความให้กับผู้ใช้อีกต่อไปการพิจารณาสถานะแถบการแจ้งเตือน การแจ้งเตือนของแถบสถานะสามารถยกเลิกได้โดยทางโปรแกรมเมื่อไม่มีความเกี่ยวข้องอีกต่อไป


1
ขอบคุณสำหรับคำแนะนำเกี่ยวกับแถบสถานะ แต่ฉันจะไปกับกิจกรรมโต้ตอบที่กำหนดเอง

337

หากคุณขุดลึกลงไปในรหัส Android คุณสามารถค้นหาบรรทัดที่ระบุอย่างชัดเจนว่าเราไม่สามารถเปลี่ยนระยะเวลาของข้อความ Toast

 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
ขอบคุณ ... นี่คือสิ่งที่ฉันต้องการ
mcherm

3
ขอบคุณสำหรับการโพสต์ค่าเริ่มต้น! ฉันกลัวว่าจะหาพวกเขาไม่เจอ
Amplify91

1
ฉันกำลังมองหาค่าขนมปังเริ่มต้นเช่นกันนี่เป็นครั้งแรกที่ตี upvoted แน่นอน ขอบคุณ!
เดฟ

120

คุณอาจต้องการลอง:

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

เพื่อเพิ่มเวลาเป็นสองเท่า ถ้าคุณระบุ 3 แทน 2 มันจะเพิ่มเวลาสามเท่า .. เป็นต้น


17
ข้อความกะพริบ :(
นิซ

61
วิธีการแก้ปัญหานี้ไม่ดีเพราะเช่นถ้าคุณออกจากกิจกรรมก่อนเวลาของขนมปังปิ้งก็จะกระพริบซ้ำแล้วซ้ำอีก ...
dwbrito

@dwbrito: เห็นด้วยอย่างยิ่งและด้วยเหตุนี้ -1
Fahim Parkar

[1] สำหรับคำตอบ .... ยกเลิกขนมปังสามารถจัดการได้โดยการใช้Toast.cancel()ในสถานที่ที่เหมาะสม
Devrath

1
ใช่มันสามารถนำไปใช้ได้ แต่ขนมปังจะกระพริบมากเท่าที่คุณระบุจำนวน
HendraWD

31

หากคุณต้องการที่Toastจะอยู่ต่อไปฉันพบว่าคุณสามารถแฮ็กเส้นทางของคุณโดยการTimerโทรtoast.show()ซ้ำ ๆ (ทุกวินาทีหรือมากกว่านั้น) การโทรshow()ไม่ได้ทำลายอะไรเลยหากToastมีการแสดงอยู่แล้ว แต่มันจะรีเฟรชระยะเวลาที่อยู่บนหน้าจอ


3
ปัญหานี้คือถ้าผู้ใช้สัมผัสหน้าจอขนมปังจะถูกซ่อนโดย Android แต่สร้างขึ้นใหม่โดยจับเวลา
Violet Giraffe

2
@VioletGiraffe ที่น่ารำคาญสวยที่จะจับกับสิ่งที่ต้องการธงบูลีนของคุณในViewGroup OnTouchเหตุการณ์ ในการปรับให้เหมาะสมคุณควรทำให้ตัวจับเวลาของคุณซ้ำใกล้เคียงกับเวลาจริงที่Toastแสดงบนหน้าจอ (3.5 วินาทีนาน 2 วินาทีสั้น)
syklon

18

ฉันได้พัฒนาคลาส Custom Toast ซึ่งคุณสามารถแสดง Toast ตามระยะเวลาที่ต้องการ (เป็นมิลลิวินาที)

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: ไม่สามารถเพิ่มหน้าต่าง - โทเค็น null ไม่ถูกต้อง กิจกรรมของคุณทำงานหรือไม่
Ahamadullah Saikat

13

ฉันเขียนรหัสคลาสผู้ช่วยเพื่อทำสิ่งนี้ คุณสามารถดูรหัสได้ที่ github: https://github.com/quiqueqs/Toast-Expander/blob/master/src/com/thirtymatches/toasted/ToastedActivity.java

นี่คือวิธีที่คุณแสดงขนมปังปิ้งเป็นเวลา 5 วินาที (หรือ 5,000 มิลลิวินาที):

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

ขอบคุณและดี แต่เราจะหยุดเธรดในตัวอย่างเช่น ฉันพยายามที่จะทำ แต่ไม่แน่ใจ: โมฆะสาธารณะคงที่ยกเลิก (Toast mytoast) {ถ้า (null! = t) t.stop (); mytoast.cancel (); }
hornetbzz

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

ขออภัยสำหรับคำถามที่สมัครใหม่นี้ แต่เมื่อฉันสร้างคลาส Toaster ข้างต้นมันบอกว่ามันไม่สามารถแก้ไขสัญลักษณ์ 'แอป' ในบรรทัด final Toast t = Toast.makeText (App.context (), ข้อความ, Toast.LENGTH_SHORT); ขอขอบคุณและขอโทษ
Brian Fleming

โอ้ขอโทษด้วย! App.context () นั้นเป็นส่วนหนึ่งของรหัสที่กำหนดเองที่ฉันเขียนเพื่อเข้าถึง ApplicationContext จากทุกที่โดยไม่ต้องผ่านมัน ไม่ใช่รูปแบบที่คุณใช้สำหรับหลายสิ่ง แต่ฉันพบว่าเหมาะสมสำหรับ ApplicationContext คุณอาจต้องการแก้ไขตัวอย่างนี้เพื่อส่ง ApplicationContext ไปยังเมธอดเป็นอาร์กิวเมนต์
Chris Aitchison

9

ฉันรู้ว่าคำตอบนั้นค่อนข้างช้า .. ฉันมีปัญหาเดียวกันมากและตัดสินใจที่จะใช้ Toast ของกระดูกเปลือยในเวอร์ชันของฉันเองหลังจากดูที่ซอร์สโค้ดของ Android สำหรับขนมปังปิ้ง

โดยทั่วไปคุณต้องสร้างตัวจัดการหน้าต่างใหม่และแสดงและซ่อนหน้าต่างตามระยะเวลาที่ต้องการโดยใช้ตัวจัดการ

 //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 () และ handleHide () ซึ่งคุณสามารถโพสต์ลงใน Handler ได้

    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
ฉันพยายามเรียกใช้ (รวมถึงการเรียก "show ()") แต่ไม่มีอะไรปรากฏขึ้น (ทดสอบบน Android 7.1) ฉันคิดว่าคุณคิดถึงอะไรบางอย่าง นอกจากนี้ส่วนที่นี่ที่ป้องกันไม่ให้มุมมองถูกลบเนื่องจากขนมปังปิ้งหายไปหลังจากช่วงเวลาสั้น ๆ
นักพัฒนา android

8

LONG_DELAYขนมปังจอแสดงผลสำหรับ3.5 วินาทีและSHORT_DELAYขนมปังจอแสดงผลสำหรับ2 วินาที

Toast ใช้ INotificationManager ภายในและเรียกมันเป็นวิธีการ enqueueToast ทุกครั้งที่มีการเรียก Toast.show ()

โทรไปที่รายการ () ด้วย SHORT_DELAY สองครั้งจะเข้าคิวขนมปังเดิมอีกครั้ง มันจะแสดงเป็นเวลา4 วินาที (2 วินาที + 2 วินาที)

ในทำนองเดียวกันเรียกการแสดง () ด้วย LONG_DELAY สองครั้งจะทำการปิ้งขนมปังอีกครั้ง มันจะแสดงเป็นเวลา7 วินาที (3.5 วินาที + 3.5 วินาที)


6

นี่คือคลาส 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();  
    }
}

5

หากคุณต้องการ Toast ที่ยาวนานมีทางเลือกที่ใช้ได้จริง แต่ผู้ใช้ของคุณต้องคลิกที่ปุ่ม OK เพื่อให้มันหายไป คุณสามารถใช้ 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
นี่คือสมาร์ท แต่ไม่สามารถนำไปใช้ในบางสิ่งบางอย่างเช่น a Serviceโดยที่ไม่มี UI
mike47

@mikejeep จริงๆแล้วฉันเพิ่งเห็นตัวอย่างโดย Google แสดงกล่องโต้ตอบโดยไม่ต้องมีกิจกรรม: developer.android.com/samples/AppShortcuts/index.html
นักพัฒนา android

5

ตามที่กล่าวถึงโดย Android Toasts อื่น ๆ สามารถเป็น LENGTH_LONG หรือ LENGTH_SHORT ไม่มีวิธีแก้ไขปัญหานี้และคุณไม่ควรทำตาม 'แฮ็ก' ที่โพสต์

วัตถุประสงค์ของ Toasts คือการแสดงข้อมูล "ที่ไม่จำเป็น" และเนื่องจากเอฟเฟ็กต์เอ้อระเหยของพวกเขาข้อความอาจจะอยู่ไกลจากบริบทถ้าระยะเวลาของพวกเขาเกินขีด จำกัด ที่แน่นอน หากมีการปรับเปลี่ยน Toasts ของหุ้นเพื่อให้สามารถแสดงได้นานกว่า LENGTH_LONG ข้อความจะปรากฏบนหน้าจอจนกว่ากระบวนการของแอปพลิเคชันจะสิ้นสุดลงเนื่องจากมีการเพิ่มมุมมองของขนมปังลงใน WindowManager ไม่ใช่ ViewGroup ในแอปของคุณ ฉันจะสันนิษฐานว่านี่คือเหตุผลที่ว่าทำไมรหัสฮาร์ด

หากคุณต้องการแสดงข้อความสไตล์ขนมปังปิ้งนานกว่าสามวินาทีครึ่งฉันขอแนะนำให้สร้างมุมมองที่แนบกับเนื้อหาของกิจกรรมวิธีนั้นจะหายไปเมื่อผู้ใช้ออกจากแอปพลิเคชัน ห้องสมุดSuperToastsของฉันเกี่ยวข้องกับปัญหานี้และอื่น ๆ อีกมากมายอย่าลังเลที่จะใช้! คุณน่าจะสนใจใช้SuperActivityToastsมากที่สุด


4

เพียงแค่ใช้SuperToastเพื่อสร้างขนมปังหรูหราในทุกสถานการณ์ ทำให้ขนมปังที่คุณมีสีสัน แก้ไขสีตัวอักษรและยังของขนาด หวังว่ามันจะเป็นทั้งหมดในที่เดียวสำหรับคุณ



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 ของ scheduleTimeoutLocked () ฟังก์ชั่นไม่ได้ใช้ระยะเวลาของฟิลด์ ซอร์สโค้ดมีดังต่อไปนี้

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 มันเป็นไลบรารี Toast ที่ยืดหยุ่นมาก

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

เค้าโครง 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>

2

ระยะเวลาขนมปังสามารถแฮ็กโดยใช้หัวข้อที่รันขนมปังเฉพาะ ใช้งานได้ (รันขนมปังเป็นเวลา 10 วินาทีปรับเปลี่ยนโหมดสลีปและctr ตามที่คุณต้องการ):

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

ขนมปังปิ้งที่มีพื้นหลังและมุมมองที่กำหนดเองได้ทำเพื่อฉัน ฉันทดสอบมันในแท็บเล็ต nexus 7 และฉันสังเกตเห็นว่าไม่มีภาพเคลื่อนไหว 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 กำลังทำให้ขนมปังของฉันมีมุมโค้งมนเหมือนในรุ่นคิทแคท คุณสามารถเพิ่มมุมมองอื่นเช่นกันในไฟล์ การปรับเปลี่ยนใด ๆ สำหรับการปรับปรุงและความคิดเห็นได้รับการสนับสนุนในขณะที่ฉันวางแผนที่จะใช้สิ่งนี้ในแอพที่ใช้งานจริงของฉัน


1

กำหนดเวลานับถอยหลังจนกว่าจะถึงเวลาในอนาคตโดยมีการแจ้งเตือนตามช่วงเวลาตามปกติ ตัวอย่างการแสดงการนับถอยหลัง 30 วินาทีในฟิลด์ข้อความ:

     ใหม่ CountDownTimer (30000, 1,000) {

     โมฆะสาธารณะ onTick (millisUntilFinished ยาว) {
         mTextField.setText ("เหลือวินาที:" + millisUntilFinished / 1000);
     }

     โมฆะสาธารณะใน onFinish () {
         mTextField.setText ( "ทำ!");
     }
  } .start ();



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

แก้ไข: ตามที่ Itai 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();

ฉันคิดว่าข้อความนี้จะหายไปหลังจาก 3.5 วินาที
Itai Spector

@ItaiSpector: ตรวจสอบรหัสใหม่ของฉันได้โปรด
Alireza Noorali

1

ไม่และแฮ็คส่วนใหญ่ / ทั้งหมดที่อยู่ในรายการนี้ไม่สามารถใช้งานกับ Android ได้อีกต่อไป แต่จะมีวิธีแก้ปัญหาที่ดีกว่ามากหากคุณต้องการส่งข้อความให้ใช้กล่องโต้ตอบ

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

แม้ว่านี่ไม่ใช่คำตอบของฮุสเซ็นที่กำลังมองหา แต่มันก็เป็นตัวเลือกที่ดีกว่า 'แฮ็ก' ทั้งหมด!
Danny EK van der Kolk

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 เพื่อให้ตัวอย่างง่าย

โดยทั่วไปคุณจะไม่ต้องการใช้ข้อความ Toast เพื่อแสดงข้อความเป็นระยะเวลานานเนื่องจากไม่ใช่วัตถุประสงค์ของคลาส Toast แต่มีบางครั้งที่จำนวนข้อความที่คุณต้องการแสดงอาจใช้เวลานานกว่า 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 วินาที) ไม่เพียงแค่นี้จะไม่มีประสิทธิภาพเพราะคุณยังคงสร้างอินสแตนซ์ของวัตถุเพิ่มเติม แต่ยัง Android ทำให้ข้อความขนมปังปิ้งในคิวที่จะแสดงหนึ่งหลังจากที่อื่นในช่วงเวลาที่กำหนดของพวกเขา ดังนั้นถ้าคุณเรียกสิ่งนี้ด้วยระยะเวลา 5 ข้อความจะแสดงจริงเป็นเวลา 17.5 วินาที
Niall

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

ทางออกที่ง่ายสำหรับคำถาม สองหรือสามของพวกเขาจะทำให้ขนมปังนาน มันเป็นทางเดียวเท่านั้น


แม้ว่าฟังดูเหมือนแฮ็ค แต่ก็ชอบความคิด!
Sony Kadavan

ทำไม downvoted โซลูชันที่คล้ายกันที่กล่าวถึงโดย @Arturo ใช้เคล็ดลับเดียวกันกับ for for loop
shabby

วิธีนี้ใช้ได้ผลสำหรับฉัน มันจะเป็นการดีถ้าได้ยินจากคนที่ลงคะแนนว่าทำไมพวกเขาถึงทำเช่นนั้น
Christopher Mills

-8

คุณสามารถกำหนดเวลาที่ต้องการในหน่วยมิลลิวินาทีในToast.makeText();วิธีนี้:

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

1
คำตอบคือถูกต้อง! API ถูกขยายเวลาเพื่ออนุญาตให้ใช้ค่าอื่นนอกเหนือจาก LENGTH_LONG หรือ LENGTH_SHORT I
rts

ฉันไม่คิดอย่างนั้น ดูandroid.googlesource.com/platform/frameworks/base/+/…
AntiCZ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.