如何从静态方法中显示对话框

3
在我的游戏中,我使用来开发Android和IOS版本。现在我需要展示视频(仅限于Android)。我打算将其显示在对话框中(位于游戏视图之上)。问题是,我没有任何活动可用于显示对话框(因为对话框只能在活动中显示)。尽管在cocos2dx库文件夹中有一个,但我不知道如何使用它。从C++代码中,我调用了Java类的静态方法,如下所示:
void LMJNICommunicator::showVideo()
{
     LOGD("initialiseDatabase inside LMJNICommunicator");

     jmethodID methodID = 0;
     JNIEnv *pEnv = 0;
     pEnv = getJNIEnv();
     jclass ret = pEnv->FindClass("com/mobinius/lostmonstersclass/LMDatabaseDataManager");
     methodID = pEnv->GetStaticMethodID(ret, "showVideo", "()V");

     if (! methodID)
     {
          LOGD("Failed to find static method id of %s", "showVideo");
          return;
     }

     pEnv->CallStaticVoidMethod(ret,methodID);
     pEnv->DeleteLocalRef(ret);

}

我从C++代码中调用的静态方法(在普通Java类中)

Class LMDatabaseDataManager {

    public static void showVideo() {

         Dialog dialog = new Dialog(Cocos2dxActivity.getInstance());
         dialog.show();
        // getting Can't create handler inside thread that has not called Looper.prepare() error
    }
}

我尝试像这篇文章中所述那样使用Handler,但没有得到结果(获得了该文章中相同的错误)。我还尝试获取静态的Context,就像这篇文章中所述一样。
那么,我的方法正确吗?如果不正确,请建议一种实现相同功能的方法。谢谢。 编辑: 最终找到了答案。早些时候,我尝试在应用程序静态上下文中在UI线程上运行,就像这个链接中所述,但是没有成功。当我使用Cocos2dxActivity活动实例时,我得到了结果。
Class LMDatabaseDataManager {

    public static void showVideo() {        

    Cocos2dxActivity.getInstance().runOnUiThread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            Dialog dialog = new Dialog(Cocos2dxActivity.getInstance());
            dialog.show();            
        }
    });

    }
}

你没有将视频叠加在一个活动上吗? - ajacian81
不,正如我在问题中解释的那样,有一个名为Cocos2dxActivity的活动,在其中运行GLSurfaceView等...我不知道是否可以利用它。 - Braj
1个回答

6

尝试在Cocos2dxActivity中添加相应的代码行:

public class Cocos2dxActivity extends Activity {
    private static Cocos2dxActivity instance = null;
   @Override public void onCreate(Bundle b) {
     ...
     this.instance = this;
     }

     public static Cocos2dxActivity getInstance() {
        return instance;
     }



}

当您想创建对话框时:

if (Cocos2dxActivity.getInstance() != null)  {
    AlertDialog dialog = new AlertDialog(Cocos2dxActivity.getInstance());
    // rest of your dialog code goes here
}

谢谢你的回复。我曾尝试过获取应用程序全局上下文,就像我在问题的第二个链接中所展示的那样,但并没有得到结果。不管怎样,我会尝试你的答案并让你知道结果。 - Braj
我尝试了你的答案...它抛出了错误“无法在未调用Looper.prepare()的线程中创建处理程序”。 - Braj
非常感谢您的时间...我解决了这个问题。之前我尝试在UI线程上使用应用程序静态上下文运行,就像第二个链接中的问题一样,但是没有成功...当我使用Cocos2dActivity活动实例时,我解决了它... - Braj
我认为 this.instance = null; 应该在 onDestroy() 方法内部调用。否则,一旦活动死亡,就会发生内存泄漏,因为对已死活动的引用将被保留。更多信息:链接 - ra3o.ra3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接