在AlertDialog中 - 无法添加窗口 - 令牌null无效;你的活动在运行吗?

时间:2018-04-04 10:34:08

标签: android xamarin.android android-alertdialog

我使用AlertDialog创建了一个自定义通知控件,它将显示在Top。它适用于某些设备,如三星Galaxy S7,S8,它运行Android 7.0操作系统。但是它在运行相同操作系统的某些移动设备上不起作用。

它正在抛出"无法添加窗口 - 令牌null无效;你的活动在运行吗?"在Show Method中。任何帮助将非常感激。以下是代码snippit。语法是xamarin。但是逻辑与原生android相同。

public class MyNotificationControl
{
    AlertDialog b;

    public MyNotificationControl(Android.Content.Context context)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(Android.App.Application.Context);
        LayoutInflater inflater = (LayoutInflater)context.GetSystemService(Context.LayoutInflaterService);
        View dialogView = inflater.Inflate(Resource.Layout.mynotification_layout, null);
        builder.SetView(dialogView);
        b = builder.Create();
        b.Window.SetType(WindowManagerTypes.Toast);

        Window window = b.Window;
        window.SetFlags(WindowManagerFlags.NotTouchModal, WindowManagerFlags.NotTouchModal);
        window.ClearFlags(WindowManagerFlags.DimBehind);
        window.SetGravity(GravityFlags.Top);
        window.SetBackgroundDrawableResource(Android.Resource.Color.Transparent);
    }

    public void Show()
    {
        try
        {
            b.Show();
        }
        catch(Exception ex)
        {
            //Here is my exception occurs.  Unable to add window -- token null is not valid; is your activity running?
        }
    }
    public void Close()
    {
        b?.Dismiss();
    }
}

3 个答案:

答案 0 :(得分:2)

  1. 在AlertDialog.Builder()中传递当前活动上下文,而不是应用程序上下文。
  2. 将AlertDialog类型设置为Toast的WindowManagerTypes.ApplicationPanel intead
clone

答案 1 :(得分:0)

请参阅this

  

当应用尝试通过打开对话框从后台线程通知用户时发生此异常。

这样做:

RunOnUiThread(() => {
    if (!IsFinishing) {
        //to call the show method
    }
});

或者您可以参考this

答案 2 :(得分:0)

对于片段,只需使用

AlertDialog.Builder builder = new AlertDialog.Builder(this.getContext());