Kri*_*s B 8 android menuitem android-animation android-webview
我有一个MenuItem
在我的ActionBar
这是一个"重装"图标.我Activity
有一个WebView
,我希望图标在WebView
开始加载网页时开始制作动画,并在完成时停止.这包括单击加载的站点中的链接.到目前为止,我第一次打开一个网页时工作,但如果我离开Activity
并加载另一个网页,"重新加载"图标似乎加倍,或者我会被NullReference
抛出异常refreshItem.setActionView(ivRefresh);
这是我的代码:
public class Browser extends SherlockFragmentActivity {
private MenuItem refreshItem;
private WebView mWebView;
@Override
public void onCreate(final Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.browser);
mWebView = (WebView)findViewById(R.id.webview);
mWebView.getSettings().setSupportZoom(true);
mWebView.getSettings().setBuiltInZoomControls(true);
mWebView.loadUrl("http://www.google.com");
mWebView.setWebViewClient(new WebBrowserClient());
mWebView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int progress) {
//if (!isFinishing() && progress == 100 && refreshItem != null && refreshItem.getActionView() != null)
//{
//refreshItem.getActionView().clearAnimation();
//refreshItem.setActionView(null);
//}
}
});
}
private class WebBrowserClient extends WebViewClient {
@Override
public void onLoadResource(WebView view, String url) {
//StartAnimation();
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
StartAnimation();
}
@Override
public void onPageFinished(WebView view, String url) {
if (refreshItem != null && refreshItem.getActionView() != null)
{
refreshItem.getActionView().clearAnimation();
refreshItem.setActionView(null);
}
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
}
private void StartAnimation() {
final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final ImageView ivRefresh = (ImageView)inflater.inflate(R.layout.refresh_view, null);
final Animation rotation = AnimationUtils.loadAnimation(this, R.anim.refresh);
ivRefresh.startAnimation(rotation);
refreshItem.setActionView(ivRefresh);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getSupportMenuInflater().inflate(R.menu.menu, menu);
refreshItem = menu.findItem(R.id.refresh);
return super.onCreateOptionsMenu(menu);
}
}
Run Code Online (Sandbox Code Playgroud)
注释掉的代码是我试图让它工作的不同方式.
更新:
经过多次调试后,我在StartAnimation
函数中设置了一个断点,有时它连续达到7次,有时却不是.这没有任何意义,因为对我而言,这应该是有效的.令人费解......
解决方案(排序):
将StartAnimation()函数更新为此,似乎解决了这个问题,但似乎更像是一个胶带解决方案:
private void StartAnimation() {
if (refreshItem != null && refreshItem.getActionView() == null)
{
final LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final ImageView ivRefresh = (ImageView)inflater.inflate(R.layout.refresh_view, null);
final Animation rotation = AnimationUtils.loadAnimation(this, R.anim.refresh);
ivRefresh.startAnimation(rotation);
refreshItem.setActionView(ivRefresh);
}
}
Run Code Online (Sandbox Code Playgroud)
为了创建流畅的用户界面体验,您的“加载轮”动画可能应该在用户单击链接时开始(而不是在新页面开始加载时),并在新页面加载时结束。这使得应用程序看起来对用户的响应速度更快,这就是Dolphin Browser中实现的行为,例如。
为了实现这一点,您需要在 WebView 中监听用户的链接点击。如何做到这一点已经在这个答案中介绍过:
在Android WebView中通过javascript检测HTML按钮的点击
您必须验证该点击实际上是在新页面的链接上。您可以通过 WebView 的HitTestResult类找到单击的 HTML 元素。SO 上的这个答案为您提供了有关如何验证 HitTestResult 值的详细信息:
您可以从 onClick() 方法开始动画,并从 WebViewClient 的 onPageFinished() 方法结束动画,如果新页面未加载,也可以在 onReceivedError() 中结束。