【问题标题】:Activity is not waiting for alert dialog活动不等待警报对话框
【发布时间】:2018-04-02 18:29:28
【问题描述】:

我实际上是一名 C# 开发人员,但目前正在使用 java 为 Android 开发应用程序。

好吧,我想创建一个通用对话框警报类,并有一个静态方法,该方法以标题、消息作为参数并显示警报。看来一切正常。这是我的课..

public class AlertDialogHelper  {

public static void setOkMessage(Context context,String title,String message)
{

    AlertDialog dialog = new AlertDialog.Builder(context).create();
    dialog.setTitle(title);
    dialog.setMessage(message);
    dialog.setButton("OK", new DialogInterface.OnClickListener()  {

        @Override
        public void onClick(DialogInterface dialog, int which) {

             // NOTHING??

        }
    });     

    dialog.setIcon(R.drawable.logo);
    dialog.show();
 }
}

我在我的splashactivity中调用了这个静态方法,但是当出现警告对话框时,在代码运行之后意味着执行下面的代码..

private void closeSplashActivity() {

 Intent activity;
 boolean isNew=true;

  try{

    DbHelper dbHelper = new DbHelper(this);
    dbHelper.openDbConnection();
    isNew = dbHelper.getSettings(DbContext.COLUMN_ISNEW);
    dbHelper.closeDbConnection();

   if (isNew)
   AlertDialogHelper.setOkMessage(this, "XXX", "YYYY");

   else
       AlertDialogHelper.setOkMessage(this, "XXXXX", "YYYYY");



 } catch (Exception ex) {

AlertDialogHelper.setOkMessage(this, "Error", "XXXXX:" + ex.getMessage());
        ex.printStackTrace();
 }

   if(isNew) 
   activity = new Intent(SplashActivity.this, ChooseQualityActivity.class); 

   else 
   activity = new Intent(SplashActivity.this, HomeActivity.class);

   startActivity(activity);
   finish();

 }

通常,它必须等待 onclick 事件之后

    if(isNew) 
   activity = new Intent(SplashActivity.this, ChooseQualityActivity.class);

必须工作.. 但是,它不会等待并运行上面的代码.. 所以,我不知道我能为它做什么.. 还有另一种创建通用对话框的方法吗?因为为每条消息创建的代码看起来很长。

@编辑..

我刚刚意识到 logcat 中有一些异常

01-30 23:07:47.375: E/WindowManager(9191): 活动 com.aaa.bbbb.SplashActivity 已泄露窗口 com.android.internal.policy.impl.PhoneWindow$DecorView{2c12e008 V.E..... R.....ID 0,0-348,285} 最初添加在这里 01-30 23:07:47.375:E/WindowManager(9191):android.view.WindowLeaked: 活动 com.aaa.bbbb.SplashActivity 已泄露窗口 com.android.internal.policy.impl.PhoneWindow$DecorView{2c12e008 V.E..... R.....ID 0,0-348,285} 最初添加在这里 01-30 23:07:47.375:E/WindowManager(9191):在 android.view.ViewRootImpl.(ViewRootImpl.java:354) 01-30 23:07:47.375:E/WindowManager(9191):在 android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:216) 01-30 23:07:47.375:E/WindowManager(9191):在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69) 01-30 23:07:47.375:E/WindowManager(9191):在 android.app.Dialog.show(Dialog.java:281) 01-30 23:07:47.375: E/窗口管理器(9191):在 com.aaa.bbbb.utility.AlertDialogHelper.setOkMessage(AlertDialogHelper.java:31) 01-30 23:07:47.375:E/WindowManager(9191):在 com.aaa.bbbb.SplashActivity.closeSplashActivity(SplashActivity.java:65) 01-30 23:07:47.375:E/WindowManager(9191):在 com.aaa.bbbb.SplashActivity.access$0(SplashActivity.java:53) 01-30 23:07:47.375:E/WindowManager(9191):在 com.aaa.bbbb.SplashActivity$1.onCompletion(SplashActivity.java:40) 01-30 23:07:47.375:E/WindowManager(9191):在 android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1980) 01-30 23:07:47.375:E/WindowManager(9191):在 android.os.Handler.dispatchMessage(Handler.java:99) 01-30 23:07:47.375:E/WindowManager(9191):在 android.os.Looper.loop(Looper.java:137) 01-30 23:07:47.375: E/窗口管理器(9191):在 android.app.ActivityThread.main(ActivityThread.java:5039) 01-30 23:07:47.375:E/WindowManager(9191):在 java.lang.reflect.Method.invokeNative(Native Method) 01-30 23:07:47.375:E/WindowManager(9191):在 java.lang.reflect.Method.invoke(Method.java:511) 01-30 23:07:47.375: E/窗口管理器(9191):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 01-30 23:07:47.375:E/WindowManager(9191):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 01-30 23:07:47.375:E/WindowManager(9191):在 dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 我认为你必须通过一个回调方法。你在哪里“什么都没有”?然后你必须调用回调方法。在标准 Dialog 行为中,它将在用户交互后执行 OnClick 方法中的代码。
  • 我也是这么想的,但我还没有找到像回调这样的东西。你能给我一个样本吗?谢谢你的回答@hmartinezd
  • @hmartinezd,我在 onclick 事件上写了 dialog.dismiss() 但它是一样的,我编辑了我的问题并放入 logcat 消息

标签: android android-alertdialog


【解决方案1】:

好的,首先你必须像这样定义一个接口:

interface MyCallback {
    void callbackCall();
}

然后在您的 AlertDialogHelper 类中包含一个成员,如下所示:

MyCallback mCallback;

我为你设置的 OkMessageMethod 添加一个参数

public static void setOkMessage(Context context,String title,String message, MyCallback callback) {
mCallback = callback

稍后在 onClick 方法中你会这样调用:

callback.callbackCall();

剩下的很简单,只要这样调用 setOkMessage:

AlertDialogHelper.setOkMessage(this, "Error", "XXXXX:" + ex.getMessage(), new MyCallback(){
 // Here the code you want to execute after the click event
});

希望对你有帮助

【讨论】:

  • 非常感谢 :) 它对我帮助很大。我更改了您的代码,因为它需要未实现的方法 bla bla .. 但现在我尝试了它,一切似乎都很好。再次感谢你:))
猜你喜欢
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 2019-02-03
  • 2018-05-29
  • 2021-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多