【问题标题】:How to show Dialog from a static method如何从静态方法显示对话框
【发布时间】:2012-11-14 10:45:09
【问题描述】:

在我使用cocos2dx 为Android 和IOS 完成的游戏中,我必须显示视频(适用于Android)。我打算在对话框中显示它(在游戏视图的顶部)。问题是,我没有引用任何活动来显示对话框(因为对话框只能在活动中显示)。即使在 cocos2dx lib 文件夹中,有一个 Cocos2dxActivity 但我不知道如何使用它。从 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
    }
}

我尝试像this 一样使用Handler,但没有得到结果(在那篇帖子中有同样的错误)。 还尝试获取静态Context,如this

那么,我的方法正确吗?如果不正确,请建议我如何实现相同的方法。谢谢。

编辑:

终于得到了答案。早些时候,我尝试在带有应用程序静态上下文的 UI 线程上运行,如 this 链接,但没有得到......我得到了 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();            
        }
    });

    }
}

【问题讨论】:

  • 您没有将视频叠加在 Activity 上吗?
  • 实际上没有......正如我在问题中解释的那样,thr 是一个名为 Cocos2dxActivity 的活动,其中 GLSurfaceView n 都在运行......我不知道我是否可以使用它

标签: java android dialog cocos2d-x android-context


【解决方案1】:

尝试在 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
}

【讨论】:

  • 感谢您的回复...一旦我在上面尝试通过获取应用程序全局上下文,如我的问题第二个链接中所示,但没有得到结果...无论如何,我会尝试您的答案 n 让您知道
  • 我试过你的答案......它的抛出错误“无法在未调用 Looper.prepare() 的线程内创建处理程序”
  • 非常感谢您抽出宝贵时间...我解决了这个问题。早些时候我尝试在 UI 线程上运行应用程序静态上下文作为有问题的第二个链接,但没有得到......使用 Cocos2dActivity 活动实例我得到它......
  • 我认为 this.instance = null; 应该从 onDestroy() 方法中调用。否则一旦活动死亡就会发生内存泄漏,因为将保留对死亡活动的引用。更多信息:link
猜你喜欢
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多