【问题标题】:Toast in SurfaceViewSurfaceView 中的吐司
【发布时间】:2011-11-05 02:15:51
【问题描述】:

我想在 SurfaceView 类中使用 Toast 创建一条消息。使用此代码,我有以下异常...

Toast toast = Toast.makeText(this.getContext(), "Message", Toast.LENGTH_LONG);
        toast.show();

11-05 02:06:08.070: ERROR/AndroidRuntime(265): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

如何在 SurfaceView 中敬酒??

【问题讨论】:

    标签: java android surfaceview toast


    【解决方案1】:

    您需要使用 UI 线程显示 Toast。每当您初始化 SurfaceView 时,请执行以下操作:

    Handler handler;
    private void initMe()
    {
        handler = new Handler();
    }
    

    然后,无论您想在哪里制作吐司,都可以这样做:

    handler.post(new Runnable(){
        public void run(){
            Toast.makeText(context, "Message", Toast.LENGTH_LONG).show();
        }
    });
    

    您需要确保从 UI 线程调用“initMe”。您可能从 onCreate 初始化 SurfaceView,它由 UI 线程调用,所以你会很好(我假设这是一个自定义 SufaceView 扩展类?)

    【讨论】:

    • 它显示一个警告..." 方法 getContext() 未定义新 Runnable(){} 类型"
    • 对。 “MyActivity.this.getContext()”或者可能只是“getContext()”没有“this”。
    【解决方案2】:

    我能够直接在 SurfaceView 类中创建 Toast,而无需使用任何处理程序。

    如果您在内部类中使用关键字“this”,但打算获取活动(外部/封装)类的对象,则需要使用它的类名,如“MainActivity.this”。这是一些平庸的 Java 开发人员可能不知道的概念。

    或者,您可以创建一个 Context 的静态对象并为其分配 Activity 的上下文,然后在任何需要它的上下文的地方简单地使用它。

    【讨论】:

      【解决方案3】:

      或者只是在你的 SurfaceView 中使用:

      runOnUiThread(new Runnable() {
                      public void run() {
                          Toast.makeText(ActivityName.this, "Message", Toast.LENGTH_LONG).show();
                      }
                  });
      

      【讨论】:

        猜你喜欢
        • 2020-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-21
        • 2012-10-30
        • 2013-10-21
        • 1970-01-01
        相关资源
        最近更新 更多