#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 лучше всего подходит для вас, она похожа на тост с кнопкой. Вот реализация кода для этого.
Ответ №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. Конечно, это не сработает. Это будет внутри вашей активности (если у вас вообще есть активность) и не будет отображаться при запуске другого приложения, в чем и заключается весь смысл тостов.