Android - сделать тост кликабельным - PullRequest
1 голос
/ 07 мая 2011

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

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

Ответы [ 4 ]

2 голосов
/ 08 августа 2017

Маленькая хитрость.Протестировано работает 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 голосов
/ 19 августа 2012

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

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

2 голосов
/ 23 мая 2014

У меня было похожее требование, которое я решил с помощью PopupWindow.По сути, у меня было окно about with clickable link, которое я хотел отобразить как тост.Всплывающее окно может выполнить это следующим образом:

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

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 голос
/ 07 мая 2011

Поместите ваш основной макет в FrameLayout.Напишите макет для вашего тоста, с помощью кнопки и всего, вставьте его в FrameLayout (под вашим основным макетом) и установите его видимость GONE.

Когда вы показываете его (настройка видимости на VISIBLE), запустите новыйпоток, который отсчитывает секунды, пока его не уволили.Установите его обратно в невидимое из потока через обработчик (потому что все элементы пользовательского интерфейса могут управляться только из основного потока).

ура!

...