Всплывающее окно в SurfaceView

#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();
                }
            });