我似乎无法把握为什么发生这种情况。 此代码:
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
方法。
Answer 1:
其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
}
Answer 2:
我使用的Android版本2.1 7.我碰到这样的(或类似)的问题,并通过使用此解决API级别:
Dialog dialog = new Dialog(this);
而不是这样的:
Dialog dialog = new Dialog(getApplicationContext());
希望这可以帮助 :)
Answer 3:
工作对我来说改变
builder = new AlertDialog.Builder(getApplicationContext());
至
builder = new AlertDialog.Builder(ThisActivityClassName.this);
奇怪的是,第一个可在谷歌教程中发现,人们就在这错误..
Answer 4:
我不认为这是围绕一个空的应用程序上下文中的计时问题
试试你的应用程序内推广应用(或只是使用它,如果你已经有了)
public class MyApp extends Application
使可作为私人单实例。 这是不能为null
private static MyApp appInstance;
使静态帮手MyApp的(将使用Singleton)
public static void showProgressDialog( CharSequence title, CharSequence message )
{
prog = ProgressDialog.show(appInstance, title, message, true); // Never Do This!
}
繁荣!!
另外,看看这里的Android工程师的回答是: 窗口管理器$ BadTokenException
此错误的一个原因可能试图通过上下文是不是一个活动以显示应用程序窗口/对话框。
现在,我同意,这是没有意义的,该方法需要的,而不是活动上下文PARAM ..
Answer 5:
看了上面的答案,我发现我的情况下面固定的问题。
这扔了错误
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()不返回一个有效的上下文? (只是猜测)。
Answer 6:
我创建与逐项叠加的地图视图。 我创建像这样从我的mapActivity我itemizedoverlay:
OCItemizedOverlay currentLocationOverlay = new OCItemizedOverlay(pin,getApplicationContext);
我发现,我会得到“android.view.WindowManager $ BadTokenException:无法添加窗口 - 令牌null不是一个应用程序”的例外,当我itemizedoverlay的方法的onTap触发(当位置上的MapView挖掘)。
我发现,如果我只过去了,“这个”,而不是“getApplicationContext()”我的构造函数,问题消失。 这似乎支持alienjazzcat的结论。 奇怪的。
Answer 7:
对于TabActivities内示出的活动使用的getParent()
final AlertDialog.Builder builder = new AlertDialog.Builder(getParent());
代替
final AlertDialog.Builder builder = new AlertDialog.Builder(this);
Answer 8:
对于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)
方法。
Answer 9:
尝试 -
AlertDialog.Builder builder = new AlertDialog.Builder(getParent());
Answer 10:
曾与(兼容性)片段类似的问题,其中使用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尽早给它更多的时间抢背景。 还是有没有保证,这将工作,它只是降低了崩溃的可能性。 如果还是不行,你不得不求助于计时器破解(这可能会导致像关闭对话框后其他时间问题)。
当然,如果你可以使用this
或ActivityName.this
,它更稳定,因为this
已经指向的东西。 但在某些情况下,如与某些片段架构,它不是一个选项。
Answer 11:
(以备将来参考)
我想这是因为有一个在应用程序上下文和活动上下文的不同,按如下说明: http://www.doubleencore.com/2013/06/context/
这意味着我们可以不使用应用程序上下文显示对话框。 而已。
Answer 12:
对于使用中的活动对话框,这样来做:
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;
}
这就是它^ _ ^
Answer 13:
我做了什么来解决这个问题是要创造我的所有活动,我存储全局数据的基类。 在第一个活动,我保存在一个变量的上下文在我的基类,如下所示:
基类
public static Context myucontext;
从基类导出的第一活动
mycontext = this
然后,我创建对话框时使用,而不是getApplicationContext mycontext。
AlertDialog alertDialog = new AlertDialog.Builder(mycontext).create();
Answer 14:
如果你调用ProgressDialog.show()的片段,铸造mContext到活动为我工作。
ProgressDialog pd = new ProgressDialog((Activity) mContext);
Answer 15:
我已经实现警报对话框异常投掷到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
Answer 16:
如果你有groupActivity问题不使用此。 家长是从父的ActivityGroup静态。
final AlertDialog.Builder builder = new AlertDialog.Builder(GroupActivityParent.PARENT);
代替
final AlertDialog.Builder builder = new AlertDialog.Builder(getParent());
Answer 17:
始终创建一个对话框,并作为活动的一部分显示。 您需要在活动方面,而不是应用程序上下文传递。
http://developer.android.com/guide/topics/ui/dialogs.html#ShowingADialog
Answer 18:
这是一个常见的问题。 使用this
替代getApplicationContext()
这应该解决您的问题
文章来源: Android: ProgressDialog.show() crashes with getApplicationContext