#java #android #surfaceview #toast
#java #Android #surfaceview #тост
Вопрос:
Я хочу создать сообщение с Toast внутри класса SurfaceView. С этим кодом у меня есть следующее исключение…
Toast toast = Toast.makeText(this.getContext(), "Message", Toast.LENGTH_LONG);
toast.show();
11-05 02:06:08.070: ОШИБКА / AndroidRuntime(265): Исключение java.lang.RuntimeException: не удается создать обработчик внутри потока, который не вызывал Looper.prepare()
Как я могу сделать тост в SurfaceView??
Ответ №1:
Вам нужно показать Toast с потоком пользовательского интерфейса. Всякий раз, когда вы инициализируете SurfaceView, делайте что-то вроде этого:
Handler handler;
private void initMe()
{
handler = new Handler();
}
Затем, где бы вы ни хотели создать toast, сделайте это:
handler.post(new Runnable(){
public void run(){
Toast.makeText(context, "Message", Toast.LENGTH_LONG).show();
}
});
Вам нужно убедиться, что «initMe» вызывается из потока пользовательского интерфейса. Вы, вероятно, вводите SurfaceView из onCreate, который вызывается потоком пользовательского интерфейса, так что у вас все будет хорошо (я предполагаю, что это пользовательский класс расширения SufaceView?)
Комментарии:
1. Он показывает предупреждение… » Метод getContext() не определен для типа new Runnable(){} »
2. Правильно. Либо «MyActivity.this.getContext()», либо, возможно, просто «getContext()» без «this».
Ответ №2:
Я смог создать Toast внутри класса SurfaceView напрямую, без использования каких-либо обработчиков.
Если вы используете ключевое слово «this» внутри внутреннего класса, но намереваетесь получить объект класса activity (внешнего / инкапсулирующего), вам нужно вместо этого использовать его имя класса, например «MainActivity.this». Это концепция, о которой некоторые посредственные разработчики Java могут не знать.
Или вы можете создать статический объект Context и назначить ему контекст действия, а затем просто использовать его везде, где вам нужен его контекст.
Ответ №3:
Или просто используйте в своем SurfaceView:
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(ActivityName.this, "Message", Toast.LENGTH_LONG).show();
}
});