我似乎无法把握为什么发生这种情况。此代码:

mProgressDialog = ProgressDialog.show(this, "", getString(R.string.loading), true);

工作得很好。然而,这种代码:

mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);

引发以下例外:

W/WindowManager(  569): Attempted to add window with non-application token WindowToken{438bee58 token=null}.  Aborting.
D/AndroidRuntime( 2049): Shutting down VM
W/dalvikvm( 2049): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
E/AndroidRuntime( 2049): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 2049): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tastekid.TasteKid/com.tastekid.TasteKid.YouTube}: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2401)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.access$2100(ActivityThread.java:116)
E/AndroidRuntime( 2049):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
E/AndroidRuntime( 2049):    at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime( 2049):    at android.os.Looper.loop(Looper.java:123)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.main(ActivityThread.java:4203)
E/AndroidRuntime( 2049):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 2049):    at java.lang.reflect.Method.invoke(Method.java:521)
E/AndroidRuntime( 2049):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime( 2049):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
E/AndroidRuntime( 2049):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 2049): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
E/AndroidRuntime( 2049):    at android.view.ViewRoot.setView(ViewRoot.java:460)
E/AndroidRuntime( 2049):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
E/AndroidRuntime( 2049):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
E/AndroidRuntime( 2049):    at android.app.Dialog.show(Dialog.java:238)
E/AndroidRuntime( 2049):    at android.app.ProgressDialog.show(ProgressDialog.java:107)
E/AndroidRuntime( 2049):    at android.app.ProgressDialog.show(ProgressDialog.java:90)
E/AndroidRuntime( 2049):    at com.tastekid.TasteKid.YouTube.onCreate(YouTube.java:45)
E/AndroidRuntime( 2049):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
E/AndroidRuntime( 2049):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
E/AndroidRuntime( 2049):    ... 11 more

任何想法,为什么发生这种情况?我是从onCreate方法调用此。

有帮助吗?

解决方案

哪些API您使用的版本?如果我是对的什么问题后,将其固定在了Android 1.6(API版本4)。

它看起来像对象引用getApplicationContext()正在返回只是点为空。我觉得你有类似的一个问题,我在之前实际完成的窗口正在建设中的一些onCreate()代码正在运行。打开你的ProgressDialog和启动任何你需要的其他(:(300-400似乎为我工作,但你需要修补IIRC)这将是一个黑客,但尝试在几百毫秒推出一个新主题例如。网络IO)。是这样的:

@Override
public void onCreate(Bundle savedInstanceState) {
    // do all your other stuff here

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            mProgressDialog = ProgressDialog.show(
               YouTube.this.getApplicationContext(), "",
               YouTube.this.getString(R.string.loading), true);

            // start time consuming background process here
        }
    }, 1000); // starting it in 1 second
}

其他提示

我使用的Android版本2.1 API级别7.我面对这种(或类似)的问题,并通过使用此解决:

Dialog dialog = new Dialog(this);

,而不是这样的:

Dialog dialog = new Dialog(getApplicationContext());

希望这有助于:)

有关我工作改变

builder = new AlertDialog.Builder(getApplicationContext());

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

奇怪的是,第一个可在谷歌教程中发现,人们就在这错误..

我不认为这是围绕一个空的应用程序上下文中的计时问题

试用应用程式内延伸应用(或只是使用它,如果你已经有了)

public class MyApp extends Application

请可作为私人单实例。这是从未空

private static MyApp appInstance;

请在MyApp的一个静态辅助(其将使用单)

    public static void showProgressDialog( CharSequence title, CharSequence message )
{
    prog = ProgressDialog.show(appInstance, title, message, true); // Never Do This!
}

<强> BOOM !!

另外,看看这里的Android工程师的回答是:窗口管理器,$ BadTokenException

  

此错误的一个原因可能试图显示应用   通过上下文是不是一个活动窗口/对话框。

现在,我同意,它是没有意义的,该方法需要一个上下文PARAM,代替活性..

在看过上面的答案,我发现我的情况下面固定的问题。

此扔错误

myButton.setOnClickListener(new OnClickListener(){
    public void onClick(View v) {
        MyDialogue dialog = new MyDialogue(getApplicationContext());
        dialog.show();              
    }
});
基于该建议的上下文中的以前的答案

是错误之一,我改变了getApplicationContext()来检索从在传递给按钮的onClick方法。

的视图的上下文
myButton.setOnClickListener(new OnClickListener(){
    public void onClick(View v) {
        MyDialogue dialog = new MyDialogue(v.getContext());
        dialog.show();              
    }
});

我不完全理解Java的工作,所以我可能是错的,但我猜,我的具体情况的原因可能已经涉及到了上面的片段是在一个抽象的活动类中定义的事实;许多活动继承和使用,也许这促成了一个事实,即getApplicationContext()不返回一个有效的上下文? (只是猜测)。

我建立与逐项叠加一个地图视图。我是从我的mapActivity创建我itemizedoverlay这样的:

OCItemizedOverlay currentLocationOverlay = new OCItemizedOverlay(pin,getApplicationContext);

我发现,我会得到“android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌null不是一个应用程序”的例外,当我itemizedoverlay的方法的onTap触发(当位置上的MapView挖掘)。

我发现,如果我只过去了,“这个”,而不是“getApplicationContext()”我的构造函数,问题消失。这似乎支持alienjazzcat的结论。怪异。

有关TabActivities内示出的活动中使用的的getParent()

final AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

代替

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

有关的Android 2.2结果 使用以下代码:结果

//activity is an instance of a class which extends android.app.Activity
Dialog dialog = new Dialog(activity);

,而不是这样的代码:结果

// this code produces an ERROR:
//android.view.WindowManager$BadTokenException: 
//Unable to add window -- token null is not for an application
Context mContext = activity.getApplicationContext();
Dialog dialog = new Dialog(mContext);

备注:被activity.onCreateDialog(int dialogId)方法之外创建我的定制对话框

尝试 -

AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

曾与(兼容性)片段类似的问题,其中使用getActivity()内的ProgressDialog.show()崩溃它。我同意,这是因为定时的。

一个可能的解决办法:

mContext = getApplicationContext();

if (mContext != null) {
    mProgressDialog = ProgressDialog.show(mContext, "", getString(R.string.loading), true);
}

,而不是使用

mProgressDialog = ProgressDialog.show(getApplicationContext(), "", getString(R.string.loading), true);

将mContext尽早给它更多的时间来抓住上下文。还是有没有保证,这将工作,它只是降低了崩溃的可能性。如果还是不行,你不得不求助于计时器破解(这可能会导致像关闭对话框后其他时间问题)。

当然,如果你可以使用thisActivityName.this,它更稳定,因为this已经指向的东西。但在某些情况下,如与某些片段结构,它不是一个选项。

有关使用内部活动对话框,这样来做:

private Context mContext;
private AlertDialog.Builder mBuilder;

@Override
protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     mContext = this;

     //using mContext here refering to activity context
     mBuilder = new AlertDialog.Builder(mContext);
     //...
     //rest of the code
     //...
}

有关使用内部片段对话框,这样来做:

private Context mContext;
private AlertDialog.Builder mBuilder;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
      View mRootView = inflater.inflate(R.layout.fragment_layout, container, false);
      mContext = getActivity();

      //using mContext here refering to fragment's hosting activity context
      mBuilder = new AlertDialog.Builder(mContext);
      //...
      //rest of the code
      //...
      return mRootView;
}

这就是它^ _ ^

我所做的来解决这个问题是要创造我的所有活动,我存储全局数据的基类。在第一活动,我保存在变量的上下文中我的基类,如下所示:

基类

public static Context myucontext; 

从基类派生的第一活动

mycontext = this

然后创建对话框,当我使用mycontext代替getApplicationContext的。

AlertDialog alertDialog = new AlertDialog.Builder(mycontext).create();

如果你调用一个片段ProgressDialog.show(),铸造mContext到活动为我工作。

     ProgressDialog pd = new ProgressDialog((Activity) mContext);

我已经实现警报对话框异常投掷到view.Whenever我喜欢这个给定当前activitty

AlertDialog.Builder builder = new AlertDialog.Builder(context);

由于警报同一窗口Exception.I写代码出来的onCreate()的,所以简单的我用context = this; setContentView()后声明中onCreate() method.Taken上下文变量为全局像Context context;

代码示例是

static Context context;

 public void onCreate(Bundle savedInstanceState)  { 
        super.onCreate(savedInstanceState); 


        setContentView(R.layout.network); 
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

        context = this;
.......

警报方法样品是

private void alertException(String execMsg){
        Log.i(TAG,"in alertException()..."+context);
        Log.e(TAG,"Exception :"+execMsg);
        AlertDialog.Builder builder = new AlertDialog.Builder(context);
.......

有关me.Actually我搜索StackOverflow上这个错误,我发现这个query.After阅读这篇文章的所有响应,我试过这样所以它的工作。我认为这是克服了异常的简单的解决方案,它工作正常。

谢谢, Rajendar

如果您有groupActivity问题不使用此。 PARENT是从父的ActivityGroup静态。

final AlertDialog.Builder builder = new AlertDialog.Builder(GroupActivityParent.PARENT);

代替

final AlertDialog.Builder builder = new AlertDialog.Builder(getParent());

总是创建的对话,并作为活动的一部分显示。需要在一个活动的上下文,而不是应用程序上下文来传递。

http://developer.android.com/guide/topics/ UI / dialogs.html#ShowingADialog

这是一个常见的问题。 使用this代替getApplicationContext()的 这应该解决您的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top