本文原创,转载请保留原文地址: http://maosidiaoxian.iteye.com/blog/1547445
在使用Dialog时,调用dismiss方法,有时会出现异常:java.lang.IllegalArgumentException: View not attached to window manager
出现这个异常的原因可能是,在dismiss对话框的时候,它所在的activity因为一些原因已经先退出了,所以会出现这个异常。
目前我认为最好的解决方法是,使用Activity里面封装好的showDialog(int id)和dismissDialog(int id)方法。
使用示例代码如下(代码取自我的一个项目,去掉与本主题无关内容,如果有小的错误,请自行调试):
/*
* @(#)SearchActivity.java Project:lol
* Date:2012-4-29
*
* Copyright (c) 2011 CFuture09, Institute of Software,
* Guangdong Ocean University, Zhanjiang, GuangDong, China.
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.sinaapp.msdxblog.android.lol.activity;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.FrameLayout.LayoutParams;
import android.widget.LinearLayout;
import com.sinaapp.msdxblog.android.lol.R;
import com.sinaapp.msdxblog.androidkit.thread.HandlerFactory;
/**
* @author Geek_Soledad (66704238@51uc.com)
*/
public abstract class WebViewActivity extends Activity {
protected WebView mSearchWV;
protected Context mContext;
private static final int PROGRESS_ID = 1;
/**
* 返回需要加载的URL地址。
*
* @return 需要加载的URL地址。
*/
protected abstract String getHomeUrl();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
mSearchWV = new WebView(mContext);
mSearchWV.getSettings().setJavaScriptEnabled(true);
mSearchWV.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
showDialog(PROGRESS_ID);
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
dismissDialog(PROGRESS_ID);
}
});
addContentView(mSearchWV, new FrameLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
mSearchWV.loadUrl(getHomeUrl());
}
@Override
protected Dialog onCreateDialog(int id) {
if (id == PROGRESS_ID) {
return ProgressDialog.show(mContext, null,
mContext.getString(R.string.loading));
}
return super.onCreateDialog(id);
}
}
分享到:
相关推荐
- 在`Activity`的`onPause()`或`onStop()`方法中调用`Dialog`的`dismiss()`方法,确保`Dialog`在`Activity`不再可见时关闭。 - 检查`Dialog`的创建逻辑,确保它不会在`Activity`已经被销毁的状态下被创建或显示。 ...
关闭Dialog时,可以调用`dismiss()`方法。 7. **动画效果**:为了增加用户体验,可以添加进入和退出动画,使Dialog的出现和消失更加自然。这可以通过设置Dialog的动画属性或者自定义动画类实现。 8. **对话框尺寸*...
使用show()方法显示Dialog,dismiss()方法关闭Dialog。源码可能包含在不同场景下何时调用这些方法的示例,如点击按钮、用户交互或特定条件触发。 4. **Dialog的生命周期**: 虽然Dialog不是Activity,但它有自己...
- 显示与隐藏:`show()`方法用来显示Dialog,`dismiss()`方法用来关闭Dialog。需要注意的是,Dialog并非Activity的一部分,不会随着Activity的生命周期变化而自动销毁,因此需要在合适的时候调用`dismiss()`以释放...
7. **显示和关闭Dialog**: 显示Dialog通常使用show()方法,而关闭Dialog则调用dismiss()方法。在Activity的onPause()和onResume()方法中处理Dialog的显示和关闭,以避免出现用户界面异常。 8. **Dialog主题和样式**...
- 同时,需要处理可能出现的异常,如网络错误、文件读取错误等,以提供良好的用户体验。 7. **测试和调试**: - 源码可能包含了测试用例,用于验证进度条对话框功能的正确性。开发者可以使用Android Studio的...
使用`ProgressDialog.show()`方法创建并显示对话框,确保在主线程中执行,以免出现异常。在下载完成后,使用`ProgressDialog.dismiss()`关闭对话框。 4. **处理线程间的通信**: 为了在子线程和主线程之间传递数据...
2. **异常情况**:如果在Activity被销毁(例如调用`finish()`方法)时,Dialog或PopupWindow仍处于打开状态,系统会抛出`WindowLeaked`异常,因为此时没有活动的Activity能够作为这些窗口的宿主,导致窗口管理器中的...
8. **线程管理**:对话框的显示和关闭应在主线程进行,否则可能会出现异常。如果你需要在后台线程更新对话框内容,记得使用Handler、runOnUiThread()或者LiveData等机制。 9. **设计原则**:全局对话框应当简洁明了...
2. **安全性检查**:确保`TextView`不为空再设置文本,避免出现空指针异常。 #### 四、定义动画资源 为了使进度对话框更加生动,通常会为进度指示器添加动画效果。在本例中,使用了`RotateAnimation`来实现旋转...
在Activity暂停或销毁时,确保对话框能够正确关闭,避免出现内存泄漏或状态异常。 通过上述步骤,你可以创建一个完整的自定义对话框。这个毕业设计的源码提供了实践示例,适合学习者进一步研究和实践Android自定义...
这些方法需要与Activity的生命周期同步,以避免出现异常。 6. **事件监听**: CommentDialog内的按钮通常会设置OnClickListener,监听用户的点击事件。当用户点击“提交”按钮时,事件监听器会触发处理评论的逻辑...
// 加载完毕后,调用 swipeRefreshLayout.setRefreshing(false) 停止刷新动画 } }); ``` 关于"如何将页面加透明",这可能是指在下拉刷新过程中,让ListView背景变透明,以便用户看到更多的内容。我们可以为...
1. 为了防止内存泄漏,记得在Activity的`onDestroy()`中调用`popupWindow.dismiss()`。 2. `PopupWindow`不能比其父Window更大,否则会出现显示异常。 总之,`PopupWindow`是Android开发中的一个重要组件,提供了...