【发布时间】:2013-07-30 08:31:02
【问题描述】:
我试图在单击 ListItem 时打开一个对话框,但出现以下错误。
Error : 07-30 14:30:17.295: E/AndroidRuntime(16563): FATAL EXCEPTION: main
07-30 14:30:17.295: E/AndroidRuntime(16563): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.view.ViewRootImpl.setView(ViewRootImpl.java:712)
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:346)
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.app.Dialog.show(Dialog.java:277)
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.app.AlertDialog$Builder.show(AlertDialog.java:932)
07-30 14:30:17.295: E/AndroidRuntime(16563): at com.itcuties.multicategoryrssreader.BlogFeeds$RssFeedTask$1.onItemClick(BlogFeeds.java:85)
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.widget.AdapterView.performItemClick(AdapterView.java:298)
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.widget.AbsListView.performItemClick(AbsListView.java:1283)
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.widget.AbsListView$PerformClick.run(AbsListView.java:3074)
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.widget.AbsListView$1.run(AbsListView.java:4147)
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.os.Handler.handleCallback(Handler.java:615)
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.os.Handler.dispatchMessage(Handler.java:92)
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.os.Looper.loop(Looper.java:137)
07-30 14:30:17.295: E/AndroidRuntime(16563): at android.app.ActivityThread.main(ActivityThread.java:4898)
07-30 14:30:17.295: E/AndroidRuntime(16563): at java.lang.reflect.Method.invokeNative(Native Method)
07-30 14:30:17.295: E/AndroidRuntime(16563): at java.lang.reflect.Method.invoke(Method.java:511)
07-30 14:30:17.295: E/AndroidRuntime(16563): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
07-30 14:30:17.295: E/AndroidRuntime(16563): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
07-30 14:30:17.295: E/AndroidRuntime(16563): at dalvik.system.NativeStart.main(Native Method)
代码:
public class BlogFeeds extends Activity {
/** Called when the activity is first created. */
ListView _rssFeedListView;
List<JSONObject> jobs;
List<RssFeedStructure> rssStr;
private BlogAdapter _adapter;
TextView textview;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview);
_rssFeedListView = (ListView) findViewById(R.id.rssfeed_listview);
textview = (TextView) findViewById(R.id.loading);
RssFeedTask rssTask = new RssFeedTask();
rssTask.execute();
}
private class RssFeedTask extends AsyncTask<String, Void, String> {
// private String Content;
// private ProgressDialog Dialog;
String response = "";
@Override
protected void onPreExecute() {
}
@Override
protected String doInBackground(String... urls) {
try {
String feed = "http:urlofawebsite";
XmlHandler rh = new XmlHandler();
rssStr = rh.getLatestArticles(feed);
} catch (Exception e) {
}
return response;
}
@Override
protected void onPostExecute(String result) {
if (rssStr != null) {
_adapter = new BlogAdapter(BlogFeeds.this, rssStr);
_rssFeedListView.setAdapter(_adapter);
textview.setVisibility(View.INVISIBLE);
_rssFeedListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
AlertDialog.Builder alert = new AlertDialog.Builder(BlogFeeds.this);
alert.setTitle("Title here");
WebView wv = new WebView(BlogFeeds.this);
wv.loadUrl(rssStr.get(position).getEncodedContent());
wv.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(
WebView view, String url) {
view.loadUrl(url);
return true;
}
});
alert.setView(wv);
alert.setNegativeButton("Close",
new DialogInterface.OnClickListener() {
@Override
public void onClick(
DialogInterface dialog,
int id) {
}
});
alert.show();
}
});
}
}
}
}
Shani 建议后的错误:
07-30 16:01:15.390:E/AndroidRuntime(623):致命异常:主要 07-30 16:01:15.390: E/AndroidRuntime(623): android.view.WindowManager$BadTokenException: 无法添加窗口 -- 令牌 android.app.LocalActivityManager$LocalActivityRecord@41c3f030 无效;您的活动正在运行吗? 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.view.ViewRootImpl.setView(ViewRootImpl.java:708) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:346) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.view.Window$LocalWindowManager.addView(Window.java:554) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.app.Dialog.show(Dialog.java:277) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.app.AlertDialog$Builder.show(AlertDialog.java:932) 07-30 16:01:15.390: E/AndroidRuntime(623): at com.itcuties.multicategoryrssreader.BlogFeeds$1.onItemClick(BlogFeeds.java:76) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.widget.AdapterView.performItemClick(AdapterView.java:298) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.widget.AbsListView.performItemClick(AbsListView.java:1283) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.widget.AbsListView$PerformClick.run(AbsListView.java:3074) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.widget.AbsListView$1.run(AbsListView.java:4147) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.os.Handler.handleCallback(Handler.java:615) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.os.Handler.dispatchMessage(Handler.java:92) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.os.Looper.loop(Looper.java:137) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 android.app.ActivityThread.main(ActivityThread.java:4898) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 java.lang.reflect.Method.invokeNative(Native Method) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 java.lang.reflect.Method.invoke(Method.java:511) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008) 07-30 16:01:15.390: E/AndroidRuntime(623): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775) 07-30 16:01:15.390: E/AndroidRuntime(623): at dalvik.system.NativeStart.main(Native Method)
【问题讨论】:
-
不要在后执行方法上打开对话框。并在后执行方法之外调用 setonitemclickListner 方法。
-
Shani - 谢谢,你能告诉我我应该把它放在哪个地方并打电话给它吗?
-
你试过调试吗?在 onclicklistener 函数中添加 try catch 并检查异常消息是什么。