Android- Сделать тост интерактивным

#android #toast

#Android #тост

Вопрос:

Я хочу сделать тост щелкающим или элемент пользовательского интерфейса, который будет иметь интерактивную кнопку, но ведет себя как toast. Он не должен запускаться в потоке пользовательского интерфейса, таком как toast. Это не должно останавливать или перекрывать текущую активность пользователя, сообщение должно приходить как toast с интерактивной кнопкой и исчезать, но как пользователь toast должен иметь возможность доступа к фоновому текущему элементу пользовательского интерфейса.

Если у кого-нибудь есть какие-либо идеи о том, как этого добиться, пожалуйста, поделитесь со мной.

Комментарии:

1. @Max что это за USB-тостер???

2. Всплывающее сообщение таково: developer.android.com/guide/topics/ui/notifiers/toasts

Ответ №1:

Маленькая хитрость. Протестирован рабочий Android 4.4

 toast = new Toast(context);
try {
    Class<?> clazz = Class.forName("android.widget.Toast");
    Method method = clazz.getDeclaredMethod("getWindowParams");
    WindowManager.LayoutParams param = (WindowManager.LayoutParams) method.invoke(toast);
    param.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
            | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
} catch (Exception e) {
    e.printStackTrace();
}
  

Ответ №2:

Панель отмены в Gmail лучше всего подходит для вас, она похожа на тост с кнопкой. Вот реализация кода для этого.

http://code.google.com/p/romannurik-code/source/browse/misc/undobar/src/com/example/android/undobar/UndoBarController.java

Ответ №3:

У меня было аналогичное требование, которое я решил с помощью всплывающего окна. В принципе, у меня было окно «О программе» с интерактивной ссылкой, которую я хотел отобразить как тост. Всплывающее окно может выполнить это следующим образом:

В родительском классе я использую следующий флаг:

 private boolean durationExpired = false;
  

Затем, когда я вызываю то, что было бы тостом, я делаю следующее вместо:

 LayoutInflater inflater = getLayoutInflater();
View layout = inflater.inflate(R.layout.about_hiittimer,
    (ViewGroup) findViewById(R.id.about_hiittimer));
TextView url = (TextView) layout.findViewById(R.id.url);
url.setMovementMethod(LinkMovementMethod.getInstance());

final PopupWindow popupWindow = new PopupWindow(layout, 280, 160, false);
popupWindow.showAtLocation(layout, 17, 0, 0);
popupWindow.setTouchable(true);
popupWindow.setOutsideTouchable(true);

final Handler popupHandler = new Handler();
runOnUiThread(new Runnable() {
    @Override
    public void run() {
        if (!durationExpired) {
            durationExpired = true;
            popupHandler.postDelayed(this, 2000);
        } else {
            popupWindow.dismiss();
            popupHandler.removeCallbacks(this);
            durationExpired = false;
        }
    }
});
  

Комментарии:

1. Вы можете поместить durationExpired в Runnable , чтобы он был более инкапсулированным.

Ответ №4:

Поместите свой основной макет в FrameLayout. Напишите макет для своего тоста с кнопкой и всем остальным, вставьте его в FrameLayout (под вашим основным макетом) и установите для него значение «ИСЧЕЗЛО».

Когда вы показываете его (устанавливаете видимость на ВИДИМУЮ), запускаете новый поток, который отсчитывает секунды до его завершения. Верните ему значение невидимый из потока с помощью обработчика (потому что всеми элементами пользовательского интерфейса можно управлять только из основного потока).

ура!

Комментарии:

1. Я хочу, чтобы элемент пользовательского интерфейса, такой как toast, предоставлял доступ к текущей активности при отображении сообщения. Например, если я играю в игру, печатаю или просматриваю что-то в market, сообщение Toast не будет ограничивать меня в доступе к этой текущей работе, не приостанавливайте игру, но одновременно показывайте сообщение. В Toast нет элемента clickabke, но я хочу создать ту же функциональность, что и в toast, но с возможностью нажатия кнопки на нем…

2. Да, и это именно то, что это делает. Он показывает вид поверх вашего основного макета. Ничто не остановлено, все по-прежнему доступно (за исключением того, что когда-либо находилось непосредственно под новым представлением, конечно). Но вы могли бы также проверить всплывающее окно. Я никогда не слышал об этом раньше, но это выглядит как гораздо более удобный способ делать то, что вы хотите.

3. Конечно, это не сработает. Это будет внутри вашей активности (если у вас вообще есть активность) и не будет отображаться при запуске другого приложения, в чем и заключается весь смысл тостов.