我的问题类似于this 2 year old question,我只是在发布同样的问题以获得更新的答案,因为很多事情在两年后发生了变化。
我正在为GingerBread +设备开发应用程序,我有很多活动,在后台我从服务器接收一些数据。现在基于该数据,在某些情况下,我需要向用户显示Dialog
。问题是我怎么知道当前最活跃的是哪个?
我尝试了什么,
我尝试在创建getApplicationContext()
的同时提供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 alertDialogBuilder = 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.argusoft.roobrooAndroid.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)
答案 0 :(得分:5)
试试这个,如果它可以帮助你:
1。使用Activity
创建transparent theme and no title
。
2。在onCreate()
中定义您的alert dialog
。
3. 从broadcastReceiver开始此活动将显示alert dialog
。
答案 1 :(得分:4)
您只需创建Activity
并将其主题设置为Dialog
manifest
,如下所示:
<activity
android:name="Dialog_MsgBox"
android:launchMode="singleInstance"
android:theme="@android:style/Theme.Dialog" >
</activity>
还将launchMode
设置为singleInstance
以防止多个活动实例。
使用您想要用于对话的任何布局。
要设置不同的消息,请添加额外的字符串消息,然后启动对话框(活动)。
答案 2 :(得分:2)
我通过
解决了这个问题private Activity currentOnTopActivity;
在我的Application类中,我在每个Activity的onResume()
和onPause()
内设置/重置此变量。
完成后,每当我想向用户显示一个Dialog时,我就会关注......
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();
}
});
}
修改强> 为了简化这个过程,我创建了一个抽象类MyActivity,它扩展了Activity并将setter调用放在了这个类的OnResume和OnPause的旁边。我的应用程序的所有其他活动只是扩展此自定义超类而不是活动。这也使我能够在获得最佳解决方案时灵活地更改基础逻辑。