Может ли Android-тост быть длиннее, чем Toast.LENGTH_LONG? - PullRequest
241 голосов
/ 08 февраля 2010

При использовании setDuration () для тоста, возможно ли установить пользовательскую длину или хотя бы что-то длиннее, чем Toast.LENGTH_LONG?

Ответы [ 28 ]

6 голосов
/ 14 ноября 2011

Вот пользовательский класс 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 голосов
/ 16 ноября 2013

Если вам нужен длинный тост, есть практическая альтернатива, но он требует, чтобы ваш пользователь нажал кнопку 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();

Если у вас длинное сообщение, скорее всего, вы не знаете, сколько времени потребуется пользователю, чтобы прочитать сообщение, поэтому иногда полезно попросить пользователя нажать кнопку ОК, чтобы продолжить. , В моем случае я использую эту технику, когда пользователь нажимает на значок справки.

5 голосов
/ 23 июня 2013

Как уже упоминалось, Android-тосты могут быть LENGTH_LONG или LENGTH_SHORT. Обойти это невозможно, и вы не должны следовать ни одному из опубликованных «хаков».

Цель тостов состоит в том, чтобы отображать «несущественную» информацию, и из-за их длительного эффекта сообщения могут быть вырваны из контекста, если их продолжительность превышает определенный порог. Если бы обычные тосты были изменены так, чтобы они могли отображаться дольше, чем LENGTH_LONG, сообщение будет задерживаться на экране до тех пор, пока процесс приложения не будет завершен, поскольку тостовые представления добавляются в WindowManager, а не в ViewGroup в вашем приложении. Я бы предположил, что именно поэтому он жестко закодирован.

Если вам абсолютно необходимо, чтобы сообщение в стиле тоста длилось более трех с половиной секунд, я рекомендую создать представление, которое будет привязано к содержимому действия, таким образом оно исчезнет при выходе пользователя из приложения. Моя SuperToasts библиотека занимается этой проблемой и многими другими, не стесняйтесь использовать ее! Скорее всего, вам будет интересно использовать SuperActivityToasts

4 голосов
/ 29 февраля 2016

Просто используйте SuperToast , чтобы сделать элегантный тост в любой ситуации. Сделайте свой тост красочным . Отредактируйте цвет шрифта , а также размер . Надеюсь, что все будет в одном для вас.

3 голосов
/ 21 декабря 2016

Вот очень простой метод, который работал для меня:

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

Продолжительность LENGTH_SHORT составляет 2 секунды, а LENGTH_LONG - 3,5 секунды. Здесь будет отображаться тостовое сообщение в течение 6 секунд , поскольку оно включено в цикл for. Но недостатком этого метода является то, что через каждые 2 секунды может возникнуть небольшой эффект замирания. но это не сильно заметно. Надеюсь, что это полезно

3 голосов
/ 18 марта 2016

Зачем есть тост, когда вы можете иметь весь Снэк-бар : https://developer.android.com/reference/android/support/design/widget/Snackbar.html

Снэкбар> Тосты, тосты по индивидуальному заказу, гренки

2 голосов
/ 11 сентября 2014

Используйте 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;
}

Кастомный макет, который будет раздут для тоста.

<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 голосов
/ 18 ноября 2013

Пользователь не может по собственному усмотрению определить продолжительность тоста. потому что функция scheduleTimeoutLocked () 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);
    }
1 голос
/ 13 июня 2014

Тост с пользовательским фоном и видом сделал свое дело для меня. Я протестировал его на планшете Nexus 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 /gment_background заставляет мой тост иметь закругленный угол, как в версии Kitkat. Вы также можете добавить другие виды в файл. Любые изменения для улучшения и комментарии приветствуются, так как я планирую реализовать это в моем живом приложении.

1 голос
/ 26 апреля 2018

Длительность тоста может быть взломана с помощью потока, который запускает тост исключительно. Это работает (запускает тост в течение 10 секунд, изменяет sleep и 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();
...