একটি অ্যান্ড্রয়েড টোস্ট টোস্টের চেয়ে বেশি দীর্ঘ হতে পারে? এলএনজিথ_লং?


263

টোস্টের জন্য সেটডিউরেশন () ব্যবহার করার সময়, কাস্টম দৈর্ঘ্য বা কমপক্ষে আরও দীর্ঘ কিছু সেট করা সম্ভব Toast.LENGTH_LONG?


4
@ নিকোলাই কোনও কারণে আপনি toastট্যাগটি সরিয়েছেন ? এটি প্রশ্নের সাথে সম্পর্কিত বলে মনে হচ্ছে ..
শ্যাডো উইজার্ড আপনার জন্য

2
@ শ্যাডো উইজার্ড ট্যাগগুলি আমার কাছে মনে হয় যে বিস্তৃত আগ্রহের প্রশ্নগুলির বিষয়গুলি প্রতিফলিত করা উচিত। উদাহরণস্বরূপ, এটি ট্যাগ করা অ্যান্ড্রয়েড এবং সুতরাং একটি অ্যান্ড্রয়েড গুরু এই প্রশ্নটি খুঁজে পাবেন। টোস্ট এই প্রশ্নটিকে মোটেও সহায়তা করে না এবং এটি অকেজো ট্যাগের মতো মনে হয়। টোস্টটি যদি ভাল হয় তবে প্রশ্নটি অ্যান্ড্রয়েডের ট্যাগ সম্পর্কে, তবে দৈর্ঘ্যটিও ছিল একটি ভাল ট্যাগ। হ্যাক, প্রশ্নের প্রতিটি শব্দই একটি ট্যাগ হওয়া উচিত ... কোনও
অনাদর করা হবে

11
আমি toastট্যাগ ব্যবহার । আমি ভেবেছিলাম ট্যাগগুলি অনুসন্ধান এবং বাছাইয়ের জন্য সহায়তা করার জন্য রয়েছে এবং toastএটি অবশ্যই একটি সাধারণ অনুসন্ধান। androidএবং toastনিখুঁত বলে মনে হচ্ছে।
ক্রিস উইলসন 4

উত্তর:


142

এর মান LENGTH_SHORTএবং LENGTH_LONG0 এবং 1 This এর অর্থ হল এগুলি প্রকৃত স্থিতাবস্থাগুলির চেয়ে পতাকা হিসাবে বিবেচিত হবে তাই আমি মনে করি না যে এই মানগুলি ব্যতীত অন্য কোনওটিতে সময়কাল নির্ধারণ করা সম্ভব হবে।

আপনি যদি বেশি দিন ব্যবহারকারীর কাছে একটি বার্তা প্রদর্শন করতে চান তবে একটি স্ট্যাটাস বার বিজ্ঞপ্তি বিবেচনা করুন । স্থিতি বারের বিজ্ঞপ্তিগুলি প্রাসঙ্গিকভাবে বাতিল করা যেতে পারে যখন সেগুলি আর প্রাসঙ্গিক না থাকে।


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
ডিফল্ট মান পোস্ট করার জন্য আপনাকে ধন্যবাদ! আমি ভীত ছিলাম আমি তাদের খুঁজে পাব না।
প্রশস্ত করুন 91

1
আমি পাশাপাশি ডিফল্ট টোস্ট মানগুলিও খুঁজছিলাম, এটিই প্রথম হিট। অবশ্যই upvated। ধন্যবাদ!
ডেভ

120

আপনি চেষ্টা করতে পারেন:

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

দ্বিগুণ সময়। যদি আপনি 2 এর পরিবর্তে 3 নির্দিষ্ট করে থাকেন তবে এটি সময়কে তিনগুণ বাড়িয়ে দেবে ... ইত্যাদি।


17
বার্তাটি জ্বলজ্বল করছে :(
ডেনিজ

61
এই সমাধানটি খারাপ কারণ, উদাহরণস্বরূপ, যদি আপনি টোস্টের সময় দেওয়ার আগে এই ক্রিয়াকলাপটি ছেড়ে দেন তবে এটি বারবার জ্বলজ্বলে হয়ে
উঠবে

@ ডাব্ব্রিটো: সম্পূর্ণরূপে একমত এবং তাই -১
ফাহিম পার্কার

[+1] উত্তরের জন্য .... টোস্ট বাতিল Toast.cancel()করা উপযুক্ত জায়গায় ব্যবহার করে পরিচালনা করা যেতে পারে
দেবরথ

1
হ্যাঁ এটি কার্যকর করা যেতে পারে, তবে
টোস্টটি

31

আপনি যদি Toastঅবিচল থাকতে চান , আমি পেয়েছি বারবার Timerকল করে আপনি তার চারপাশে হ্যাক করতে পারেন toast.show()(প্রতি সেকেন্ডে বা তাই করা উচিত)। ইতিমধ্যে প্রদর্শিত show()থাকলে কল করা কিছুতেই ভাঙবে না Toast, তবে এটি স্ক্রিনে থাকা সময়ের পরিমাণকে রিফ্রেশ করে।


3
এটির সাথে সমস্যাটি যদি ব্যবহারকারী স্ক্রিনটি স্পর্শ করে তবে টোস্টটি অ্যান্ড্রয়েড দ্বারা আড়াল করা হবে তবে টাইমার দ্বারা পুনরায় তৈরি করা হবে।
ভায়োলেট জিরাফ

2
@ ভায়োলেটজিরাফ এটি আপনার ViewGroup OnTouchইভেন্টে বুলিয়ান পতাকার মতো কিছু সহ্য করার জন্য বেশ তুচ্ছ । এটির অনুকূলিতকরণের জন্য আপনার Toastপর্দায় প্রদর্শিত
টাইমটির

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

এটি করার জন্য আমি একটি সহায়ক ক্লাস আপ করেছি। আপনি গিথুবে কোডটি দেখতে পাবেন: https://github.com/quiqueqs/Toast-Expender/blob/master/src/com/thirtymatches/toasted/ToastedActivity.java

এভাবে আপনি 5 সেকেন্ডের জন্য (বা 5000 মিলিসেকেন্ড) টোস্টটি প্রদর্শন করবেন:

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

থেক্স এবং নিস কিন্তু উদাহরণস্বরূপ আমরা কীভাবে থ্রেডটি থামাতে পারি? আমি এটি করার চেষ্টা করেছি তবে নিশ্চিত নই: পাবলিক স্ট্যাটিক শূন্যতা বাতিল (টোস্ট মাইটোস্ট) {যদি (নাল! = টি) t.stop (); mytoast.cancel (); }
হর্নেটবেজ

10

আমি জানি যে আমি কিছুটা দেরি করে ফেলেছি, তবে আমি রেজিস_এজি এর উত্তর নিয়েছি এবং এটি একটি সহায়ক শ্রেণিতে মুড়ে ফেলেছি এবং এটি দুর্দান্ত কাজ করে।

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

এটি আসলে কাজ করে! তবে কীভাবে আপনি এটি অনুকূলিতকরণযোগ্য এবং স্পর্শযোগ্য করতে পারেন?
অ্যান্ড্রয়েড বিকাশকারী 13

এই নবাগত প্রশ্নের জন্য দুঃখিত, তবে আমি যখন উপরের টোস্টার ক্লাসটি তৈরি করি তখন এটি বলে যে এটি লাইনে 'অ্যাপ' চিহ্নটি সমাধান করতে পারে না। চূড়ান্ত টোস্ট টি = টোস্ট.মেকটেক্সট (App.context (), পাঠ্য, টোস্ট LELENGTH_SHORT); ধন্যবাদ, এবং দুঃখিত।
ব্রায়ান ফ্লেমিং

ওহ, দুঃখিত! App.context () মূলত আমি যে কোনও কাস্টম কোডটি লিখেছিলাম যা অ্যাপলিকনটেক্সটটি সহজেই কোথাও থেকে পাস না করে অ্যাক্সেস করার জন্য লিখেছিল। আপনি অনেক কিছুর জন্য যে প্যাটার্নটি ব্যবহার করবেন তা নয়, তবে আমি দেখতে পেলাম যে এটি অ্যাপ্লিকেশন কনটেক্সট-এর জন্য সার্থক হয়েছে। আর্গুমেন্ট হিসাবে অ্যাপ্লিকেশন কনটেক্সটটি পদ্ধতিতে পাস করার জন্য আপনি এই স্নিপেটটি সম্পাদনা করতে চাইতে পারেন।
ক্রিস আইচিসন

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
আমি এটি চালানোর চেষ্টা করেছি ("শো ()" তে কল সহ) তবে কিছুই উপস্থিত হয়নি (Android 7.1 এ পরীক্ষিত)। আমার মনে হয় আপনি কিছু মিস করছেন এছাড়াও, এখানে এমন অংশটি কোথায় রয়েছে যা দর্শনটি অপসারণ হতে বাধা দেয়, যেমন টোস্ট অল্প সময়ের পরে অদৃশ্য হয়ে যায়?
অ্যান্ড্রয়েড বিকাশকারী

8

LONG_DELAY জন্য প্রদর্শন টোস্ট 3.5 সেকেন্ড এবং SHORT_DELAY জন্য প্রদর্শন টোস্ট 2 সেকেন্ড

টোস্ট অভ্যন্তরীণভাবে ইনোটিফিকেশন ম্যানেজার ব্যবহার করে এবং প্রতিবার টোস্ট.শো () বলা হলে এটিকে এনকুইওস্ট পদ্ধতি বলে।

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

আপনার যদি দীর্ঘ টোস্টের প্রয়োজন হয় তবে ব্যবহারিক বিকল্প রয়েছে তবে এটির দূরে যেতে আপনার ব্যবহারকারীর একটি ঠিক আছে বোতামে ক্লিক করা প্রয়োজন। আপনি এটির মতো একটি সতর্কতা ডায়ালগ ব্যবহার করতে পারেন:

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, যেখানে কোনও ইউআই নেই।
মাইক 47 ই

@ মিকেজিপ আসলে, আমি সম্প্রতি গুগলের একটি উদাহরণ দেখেছি, কোনও ক্রিয়াকলাপ ছাড়াই একটি ডায়ালগ দেখিয়েছি: developer.android.com/sample/appShortcuts/index.html
অ্যান্ড্রয়েড বিকাশকারী

5

অন্যদের দ্বারা উল্লিখিত হিসাবে অ্যান্ড্রয়েড টোস্টগুলি হয় হয় LENGTH_LONG বা LENGTH_SHORT হতে পারে। এর আশেপাশে কোনও উপায় নেই বা পোস্ট করা 'হ্যাকস' এর কোনওটি অনুসরণ করা উচিত নয়।

টোস্টের উদ্দেশ্য হ'ল "অ-অপরিহার্য" তথ্য প্রদর্শন করা এবং তাদের দীর্ঘকালীন প্রভাবের কারণে বার্তাগুলি প্রাসঙ্গিকতার বাইরে রাখা যেতে পারে যদি তাদের সময়কাল একটি নির্দিষ্ট চৌম্বকটি অতিক্রম করে। যদি স্টক টোস্টগুলি সংশোধন করা হয় যাতে তারা LENGTH_LONG এর চেয়ে বেশি দীর্ঘ প্রদর্শন করতে পারে তবে অ্যাপ্লিকেশনটির প্রক্রিয়াটি উইন্ডো ম্যানেজারে যুক্ত না করে এবং আপনার অ্যাপ্লিকেশনটিতে একটি ভিউগ্রুপ নয়, যতক্ষণ না অ্যাপ্লিকেশনটির প্রক্রিয়াটি শেষ না হয় ততক্ষণ বার্তাটি স্ক্রিনে স্থির থাকে। আমি ধরে নেব এই কারণেই এটি হার্ড কোডেড।

যদি আপনাকে অবশ্যই টোস্ট স্টাইলের বার্তাটি সাড়ে তিন সেকেন্ডেরও বেশি সময় দেখানোর প্রয়োজন হয় তবে আমি ক্রিয়াকলাপের বিষয়বস্তুর সাথে সংযুক্ত হয়ে এমন দৃষ্টিভঙ্গি তৈরির প্রস্তাব দিই, যখন ব্যবহারকারী অ্যাপ্লিকেশনটি প্রস্থান করবেন তখন এইভাবে অদৃশ্য হয়ে যাবে। আমার সুপারটোস্ট লাইব্রেরি এই সমস্যাটি এবং আরও অনেকের সাথে ডিল করে, এটি নির্দ্বিধায় ব্যবহার করুন! আপনি সম্ভবত সুপারঅ্যাক্টিভিটিওস্ট ব্যবহার করতে আগ্রহী হবেন


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

ব্যবহারকারীর টোস্টের সময়কাল নির্দিষ্ট করে দিতে পারে না। কারণ নোটিফিকেশন ম্যানেজারসেবারের শিডিউল টাইমআউটলকড () ফাংশনটি ক্ষেত্রের সময়কাল ব্যবহার করে না। উত্স কোডটি নিম্নলিখিত is

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

@ অঙ্কনযোগ্য / ফ্রেগমেন্ট_ব্যাকগ্রাউন্ডটি আমার টোস্টটি কিটক্যাট সংস্করণের মতো গোলাকার কোণায় পরিণত করছে। আপনি ফাইলটিতে অন্যান্য মতামত যুক্ত করতে পারেন। উন্নতি এবং মন্তব্যে যেকোন পরিবর্তনকে উত্সাহ দেওয়া হয়েছে কারণ আমি এটি আমার লাইভ অ্যাপ্লিকেশনটিতে প্রয়োগ করার পরিকল্পনা করছি।


1

ভবিষ্যতে কোনও সময় অবধি কাউন্টডাউন শিডিয়ুল করুন, পাশাপাশি বিরতিতে নিয়মিত বিজ্ঞপ্তিগুলি সহ। একটি পাঠ্য ক্ষেত্রে 30 সেকেন্ডের কাউন্টডাউন দেখানোর উদাহরণ:

     নতুন কাউন্টডাউনটাইমার (30000, 1000) {

     অন ​​টিক পাবলিক অকার্যকর (দীর্ঘ মিলিস ইউনিকাল ফিনিশড) {
         mTextField.setText ("সেকেন্ড বাকি:" + মিলিসUntilFinished / 1000);
     }

     ফিনিশ () public
         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

সম্পাদনা করুন: যেমন মন্তব্যটিতে ইতাই স্পেক্টর বলেছেন এটি প্রায় 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

@ আইটাইস্পেক্টর: আমার নতুন কোডটি পরীক্ষা করুন, দয়া করে।
আলিরেজা নুরালি

1

না, এবং এখানে তালিকাভুক্ত বেশিরভাগ / সমস্ত হ্যাক আর অ্যান্ড্রয়েড in এ কাজ করে না But তবে এর চেয়ে আরও ভাল সমাধান রয়েছে: আপনার বার্তাটি যদি ঘুরে দেখার দরকার হয় তবে একটি ডায়ালগ বক্স ব্যবহার করুন।

(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 বিকল্পটি মুছে ফেলে।

আপনি সাধারণত খুব দীর্ঘ বিরতির জন্য বার্তা প্রদর্শন করতে একটি টোস্ট বার্তা ব্যবহার করতে চাইবেন না, কারণ এটি টোস্ট ক্লাসের উদ্দেশ্যযুক্ত উদ্দেশ্য নয়। তবে এমন অনেক সময় রয়েছে যখন আপনাকে প্রদর্শিত পাঠ্যের পরিমাণটি পড়তে ব্যবহারকারীকে ৩.৫ সেকেন্ডের বেশি সময় লাগতে পারে এবং সেক্ষেত্রে সামান্য সময় বাড়ানো (যেমন উপরে বর্ণিত 6.৫ সেকেন্ড) আইএমও, দরকারী হতে পারে এবং অভিযুক্ত ব্যবহারের সাথে সামঞ্জস্যপূর্ণ।


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
টোস্টটি প্রদর্শিত রাখার জন্য বার বার "শো" কল করার সাথে সম্পর্কিত এই প্রশ্নের বেশিরভাগ সমাধান একই টোস্টের উদাহরণ সহ এটি করছে, যেখানে আপনার প্রকৃতপক্ষে প্রতি সেকেন্ডে একটি নতুন টোস্ট ইভেন্ট তৈরি হচ্ছে এবং উল্লেখ করা হচ্ছে যে প্রত্যেকটি লংয়ের জন্য প্রদর্শিত হবে spec সময়কাল (সাধারণত 3.5 সেকেন্ড)। আপনি কেবল অতিরিক্ত বস্তুর উদাহরণ তৈরি করতে থাকায় এটি কেবল অদক্ষ নয়, তবে অ্যান্ড্রয়েডও তাদের নির্দিষ্ট সময়কালের জন্য একের পর এক দেখানোর জন্য টোস্ট বার্তাগুলিকে একটি কাতারে রাখে। সুতরাং আপনি যদি 5 এর সময়কালের সাথে এটি কল করেন তবে বার্তাটি 17.5 সেকেন্ডের জন্য প্রদর্শিত হবে।
নিলাল

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

প্রশ্নের খুব সহজ সমাধান এর মধ্যে দু'বার বা ট্রিপল টোস্টকে দীর্ঘস্থায়ী করবে। এটি প্রায় একমাত্র উপায়।


শোনাচ্ছে হ্যাক, তবে চিন্তার প্রশংসা করুন!
সনি কদাভান

কেন downvoted একটি অনুরূপ সমাধান @Arturo উল্লেখ সঙ্গে লুপ জন্য একই কৌতুক ব্যবহার
হীন

এই পদ্ধতির আমার জন্য কাজ করে। যারা ভোট দিয়েছিল তারা কেন এমনটি করেছে তা তাদের কাছ থেকে শুনতে ভাল লাগবে।
ক্রিস্টোফার মিলস

-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 ব্যতীত অন্য কোনও মান ব্যবহারের অনুমতি দেওয়ার জন্য এপিআই কিছু সময় বাড়ানো হয়েছিল। আমি
RTS

আমি তাই মনে করি না. এ android.googlesource.com/platform/frameworks/base/+/...
AntiCZ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.