myMsg
的webview(加载本地文件,因此没有延迟),这会使动画出现问题。使用以下代码(没有webview),对话框可以完美地工作,并在进入和退出时进行动画处理。但是,如果取消注释
//builder.setView(myMsg)
这一行,则退出动画仍然完美运行,但进入动画不会执行(或执行得太快)。有趣的是,如果我最小化应用程序并再次最大化它,则进入对话框动画就可以正常执行。就像webview加载干扰了进入动画一样。我尝试在webview加载后显示对话框,但结果相同。
这不是很疯狂吗?有什么线索可以解释发生了什么以及如何解决它吗?任何帮助都将不胜感激。
以下是代码的相关部分:
WebView myMsg = new WebView(context);
myMsg.loadUrl("file:///android_asset/page.html");
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setIcon(R.drawable.ic_launcher);
//builder.setView(myMsg);
builder.setTitle("Some Title");
final AlertDialog dialog = builder.create();
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
lp.windowAnimations = R.style.AnimateDialog;
dialog.show();
dialog.getWindow().setAttributes(lp);
还有样式方面的内容,
<style name="AnimateDialog">
<item name="android:windowEnterAnimation">@anim/in_left</item>
<item name="android:windowExitAnimation">@anim/out_left</item>
</style>
编辑
我尝试使用setWebViewClient
,但没有成功(如果没有dialog.getWindow().setLayout...
这行代码,进入动画就无法正常工作):
WebView myMsg = new WebView(context);
myMsg.getSettings().setJavaScriptEnabled(true);
myMsg.loadUrl("file:///android_asset/" + page);
myMsg.setBackgroundColor(0);
myMsg.setSoundEffectsEnabled(true);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setIcon(R.drawable.ic_launcher);
builder.setTitle("SomeTitle");
builder.setView(myMsg);
final AlertDialog dialog = builder.create();
myMsg.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
dialog.show();
dialog.getWindow().setWindowAnimations(R.style.AnimateDialog);
dialog.getWindow().setLayout(WindowManager.LayoutParams.FILL_PARENT, WindowManager.LayoutParams.FILL_PARENT);
}
}
编辑2
我还尝试了使用Dialog而不是AlertDialog,并使用xml布局,出现了相同的问题(也尝试过使用WebView.loadData
而不是WebView.loadUrl
,问题相同):
final Dialog d = new Dialog(context);
d.setContentView(R.layout.viewhtml);
d.setTitle("SomeTitle");
// Without this, Enter animation does not work
d.getWindow().setLayout(WindowManager.LayoutParams.FILL_PARENT,
WindowManager.LayoutParams.FILL_PARENT);
WebView wv = (WebView) d.findViewById(R.id.webview);
wv.loadUrl("file:///android_asset/" + page);
wv.setBackgroundColor(0);
d.getWindow().setWindowAnimations(R.style.AnimateDialog);
wv.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
d.show();
}
});
这是对话框的 XML 布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<WebView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/webview"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:soundEffectsEnabled="true" >
</WebView>
</LinearLayout>
编辑3
我刚刚意识到,当使用TextView.setText(Html.fromHTML…)
来代替WebView
时,同样的问题也会发生在TextView
上。此外,如果我在dialog.show()
之后添加dialog.getWindow().setLayout(600,800)
,则动画将按预期执行。因此,问题似乎是没有提前知道对话框大小就无法执行动画?
onPageFinished
方法(你忘记将WebViewClient
附加到WebView
上了,对吧?)。但问题仍然存在。现在,即使使用WindowManager.LayoutParams.FILL_PARENT
,Entry动画也根本不起作用,除非把它放在WebViewClient
内部。请看一下我的原帖EDIT,看看唯一能让动画工作的东西(但仍然只能使用WindowManager.LayoutParams.FILL_PARENT
并且仍然是异步的)。有没有办法先禁用默认动画呢? - Luis A. FloritWebView(17458): onSizeChanged - w:582 h:0
和WebView(17458): onSizeChanged - w:582 h:708
。那么为什么它的高度从 0 开始,但宽度不为零呢? - Luis A. FloritonPageFinished
内部,如果您不想将布局放在XML文件中,则可以尝试在布局设置完成后调用show
。 - user2647899onPageFinished
中放置dialog.show
,但是我得到了相同的错误行为,现在还增加了一个问题,即当方向改变时,对话框会崩溃,因为这个原因:https://dev59.com/inNA5IYBdhLWcg3wC5Th - Luis A. Florit