如何在另一个上下文中显示对话框?
How can I show a dialog on another context?
我的 android 应用程序需要在延迟后显示一个对话框。问题是当对话框显示时,上下文可能已经改变。
我该如何解决这个问题?
我的代码现在是这样的:
class UpdateRunnable extends Runnable {
private Context ctx;
UpdateRunnable(Context ctx) {
this.ctx = ctx
}
@Override
public void run() {
//throws exception: "Unable to add window -- token null is not for an application"
AlertDialog.Builder builder = new AlertDialog.Builder(ctx.getApplicationContext());
builder.setTitle("Time to refresh data");
builder.setMessage("Data needs updating");
builder.show();
}
}
class MyAvtivity extends AppCompatActivity {
@override
public void onCreate(...) {
Handler updateHandler = new Handler();
updateHandler.postDelayed(new UpdateRunnable(this), 10000);
//do some stuff
//start another activity
}
}
AlertDialog.Builder 不适用于 ApplicationContext。这就是为什么您会收到错误的令牌异常。
所以你需要确保你的runnable的上下文是你当前的activity上下文,或者尝试不同的方法,比如使用一个服务,其逻辑是什么时候在里面显示对话框,并让它通知当前 activity 它应该显示对话框,或者使用服务启动带有 Dialog.Theme 的 activity 而不是使用 AlertDialog。
你试过 ContextWrapper 了吗?
private Context ctx;
UpdateRunnable(Activity activity) { this.activity = activity }
@Override public void run() {
if(!activity.isFinishing()){
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Time to refresh data");
builder.setMessage("Data needs updating");
builder.show();
}
}
我的 android 应用程序需要在延迟后显示一个对话框。问题是当对话框显示时,上下文可能已经改变。
我该如何解决这个问题?
我的代码现在是这样的:
class UpdateRunnable extends Runnable {
private Context ctx;
UpdateRunnable(Context ctx) {
this.ctx = ctx
}
@Override
public void run() {
//throws exception: "Unable to add window -- token null is not for an application"
AlertDialog.Builder builder = new AlertDialog.Builder(ctx.getApplicationContext());
builder.setTitle("Time to refresh data");
builder.setMessage("Data needs updating");
builder.show();
}
}
class MyAvtivity extends AppCompatActivity {
@override
public void onCreate(...) {
Handler updateHandler = new Handler();
updateHandler.postDelayed(new UpdateRunnable(this), 10000);
//do some stuff
//start another activity
}
}
AlertDialog.Builder 不适用于 ApplicationContext。这就是为什么您会收到错误的令牌异常。
所以你需要确保你的runnable的上下文是你当前的activity上下文,或者尝试不同的方法,比如使用一个服务,其逻辑是什么时候在里面显示对话框,并让它通知当前 activity 它应该显示对话框,或者使用服务启动带有 Dialog.Theme 的 activity 而不是使用 AlertDialog。
你试过 ContextWrapper 了吗?
private Context ctx;
UpdateRunnable(Activity activity) { this.activity = activity }
@Override public void run() {
if(!activity.isFinishing()){
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
builder.setTitle("Time to refresh data");
builder.setMessage("Data needs updating");
builder.show();
}
}