7

我的问题类似于这个 2 岁的问题,我只是重新发布相同的问题以获得更新的答案,因为两年内发生了很多变化。

我正在为 GingerBread+ 设备开发应用程序,我有很多活动,并且在后台我从服务器接收一些数据。现在基于该数据,在某些情况下我需要向Dialog用户显示。问题是我如何知道当前最前沿的活动?

我尝试过的, 我尝试过创建getApplicationContext()while Dialog,但是那是行不通的。抛出一些异常。

一个办法 ?(我真的很讨厌它),Application一个解决方案可能是通过在类中有一个变量并将其设置onResume()为每个活动 来跟踪当前可见的活动。如果他们是实现这一目标的更聪明的方法,我真的不想做这本书,我相信他们是实现这一目标的更聪明的方法,

我的简单问题是,
如何显示有关当前可见活动的对话框?, 这样我就可以引用 AlertDialog.Builder,我认为它会完成我的工作。如果不是,我如何在最顶层的 Activity 上显示一个对话框?

编辑,我使用以下代码创建了一个简单的对话框 private View.OnClickListener cancelClickListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
                LoginActivity.this);

        // set title
        alertDialogBuilder.setTitle("Roobroo will exit..");

        // set dialog message
        alertDialogBuilder
                .setMessage("Are you sure you want to exit ?")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                // if this button is clicked, close
                                // current activity
                                LoginActivity.this.finish();
                            }
                        })
                .setNegativeButton("No",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int id) {
                                // if this button is clicked, just close
                                // the dialog box and do nothing
                                dialog.cancel();
                            }
                        });

        // create alert dialog
        AlertDialog alertDialog = alertDialogBuilder.create();

        // show it
        alertDialog.show();
        // TODO Write the code to exit from the app, (gracefull exit)
        Log.i(LOG_CAT, "Cancel Button is clicked");
    }
};

使用 AlertDialog.Builder 的异常 alertDialogBu​​ilder = new AlertDialog.Builder(getApplicationContext()); 给了我以下例外,

06-11 14:09:16.732: E/AndroidRuntime(1005): FATAL EXCEPTION: main
06-11 14:09:16.732: E/AndroidRuntime(1005): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.view.ViewRoot.setView(ViewRoot.java:531)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.app.Dialog.show(Dialog.java:241)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at com.mycompany.myapp.activities.LoginActivity$3.onClick(LoginActivity.java:127)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.view.View.performClick(View.java:2485)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.view.View$PerformClick.run(View.java:9080)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.os.Handler.handleCallback(Handler.java:587)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.os.Looper.loop(Looper.java:123)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at android.app.ActivityThread.main(ActivityThread.java:3683)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at java.lang.reflect.Method.invokeNative(Native Method)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at java.lang.reflect.Method.invoke(Method.java:507)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
06-11 14:09:16.732: E/AndroidRuntime(1005):     at dalvik.system.NativeStart.main(Native Method)
4

3 回答 3

6

如果对您有帮助,请尝试以下操作:

1.Activitytransparent theme and no title. _

2.onCreate()定义你的alert dialog.

3.从 broadcastReceiver 开始这个活动将显示alert dialog.

于 2012-06-12T10:41:10.700 回答
4

只需像这样创建一个Activity并将其主题设置Dialogmanifest

  <activity
        android:name="Dialog_MsgBox"
        android:launchMode="singleInstance"
        android:theme="@android:style/Theme.Dialog" >
    </activity>

还设置launchModesingleInstance防止多个活动实例。使用您想要用于对话框的任何布局。

要设置不同的消息,请放置额外的字符串消息并在您启动对话框(活动)时获取它们。

于 2012-06-12T11:01:10.630 回答
2

不是最好的解决方案,但它对我有用..

我创建了一个抽象类 MyActivity,它扩展了 Activity 并将 setter 调用放在此类的 OnResume 和 OnPause 一侧。我的应用程序的所有其他活动只是扩展了这个自定义超类而不是活动。

然后我在Application类中创建了这个类的一个变量,

private Activity currentOnTopActivity;

我在MyActivity 类中onResume()设置/重置了这个变量。onPause()

完成后,每当我想向用户显示一个对话框时,我只需执行以下操作...

   if (currentOnTopActivity!=null && !currentOnTopActivity.isFinishing()) {
                currentOnTopActivity.runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                        String msg = "Some msg";
                        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(currentOnTopActivity);
                        AlertDialog invitationDialog = null;

                        // set title
                        alertDialogBuilder.setTitle("Title ");

                        // set dialog message
                        alertDialogBuilder.setMessage(msg).setCancelable(false).setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                         // do something                            }
                        });

                        // create alert dialog
                        invitationDialog = alertDialogBuilder.create();

                        // show it on UI Thread
                        invitationDialog.show();

                    }

                });
            }

引入一个 Super Activity 类也让我可以灵活地将通用代码放在这个抽象类中,而不是在每个其他 Activity 中复制它。

于 2012-07-04T08:04:15.067 回答