【发布时间】:2012-08-16 20:56:38
【问题描述】:
我不需要活动上的创建对话框的代码。 我使用 opengles,我正在使用我创建的渲染器类进行绘图。我认为 android 活动窗口的执行停留在主要活动中。 我有我的绘图状态,当绘图达到一个状态时,我想发布一个对话框。所以这是一个问题,因为对话框构建器需要一个上下文,而渲染器类不是一个活动对象。 我是 opengles 的新手,首先我所做的所有工作都存在于 方法
public void onDrawFrame(GL10 gl)
{ }
所以我有 2 个类第 1 个 ui 类
mainactivity extends activity
第二个渲染器类
class mainrenderer implements GLSurfaceView.Renderer
我想从第二类中使用活动操作,例如创建对话框。 你能给我一个解决方案吗? 谢谢。
换句话说,我想从一个不是 ui 类的类(渲染器)中创建一个对话框。
已编辑
我传递了我的活动类的上下文
作为myrender = new Renderer1(this);
在渲染器的构造函数中我有
class Renderer1 implements GLSurfaceView.Renderer
/* initializations */
public Renderer(Context context) {
super();
mcontext = context;
}
然后我实现了on drawFrame 方法,当我达到一个状态时我调用方法alertdialogbox()
下面给出
public void alertdialogbox() /* some code */ AlertDialog.Builder
builder = new AlertDialog.Builder(mcontext);
但是当达到alertdialogbox调用的状态时,它会不断出错和应用程序崩溃
错误以
开头java.lang.RuntimeException:无法在线程内创建处理程序 没有调用 Looper.prepare()
编辑 2 已解决 我在主要活动中初始化一个处理程序:
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
alertdialogbox();
}
};
alertdialogbox 是我在主活动类中声明的方法 并构造对话框
再次在我实例化 GlsurfaceView 和 Glrenderer 的主要活动中 我传递了我之前初始化的处理程序:
Renderer = new Renderer1(handler);
after that at the class Renderer1
class Renderer1 implements GLSurfaceView.Renderer
Handler mhandler;
public Renderer( Handler handler) {
super();
mhandler = handler;
}
*
*
public void onDrawFrame(){
*
*
if (state)
{
alertdialogbox();
}
}
*
*
public void alertdialogbox()
{
mhandler.sendEmptyMessage(1);
}
最后我查看了我的对话框。
感谢您的建议。
【问题讨论】:
-
您可以创建一个方法 makeDialog ,该方法将
context作为参数,或者在创建MainRenderer时传递上下文以将其作为类字段。如果不知道您打算以哪种方式使用代码,很难写出更具体的答案:) -
如果您编辑问题并在其中编写代码,则更易于阅读。同样对于崩溃,最好提供错误和堆栈跟踪,因为这是所有信息所在的位置:o)
-
您的渲染器类未在 UI 线程上执行,因此出现错误。我建议你看看
Handler类。在您的主要活动中创建一个处理程序,并在创建时将其传递给渲染器。然后使用这个处理程序来创建对话框。
标签: android opengl-es android-activity