Android 覆盖 url 加载时的 WebView 问题
Android WebView issue on override url loading
我试图在点击应用 WebView 上的 link 时覆盖 url 加载。
页面加载但 WebView 将保持其上次滚动位置和内容大小。
我是否忘记在 WebView 上设置某些参数以在下次加载时重置内容大小和滚动位置?
以下是我的使用方法:
@SuppressLint("SetJavaScriptEnabled")
@AfterViews
protected void afterViews() {
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebClient());
webView.setWebChromeClient(new ChromeClient());
webView.loadUrl(url);
}
public class WebClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
boolean isValidEmail = url.startsWith("mailto:") && Patterns.EMAIL_ADDRESS.matcher(url.substring("mailto:".length())).matches();
boolean isValidPhone = url.startsWith("tel:") && Patterns.PHONE.matcher(url.substring("tel:".length())).matches();
if (url.startsWith("about:")) {
return super.shouldOverrideUrlLoading(view, url);
}
if (isValidEmail) {
Intent sendIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse(url));
startActivity(Intent.createChooser(sendIntent, ""));
} else {
if (isValidPhone) {
Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
startActivity(Intent.createChooser(dialIntent, ""));
} else {
WebViewActivity.this.setPageTitle(url);
webView.loadUrl(url);
}
}
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
//..
}
}
public class ChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int progress) {
//...
}
}
谢谢。
您是否尝试在 onPageFinished 中设置滚动位置?
@Override
public void onPageFinished(WebView view, String url) {
// other code...
view.scrollTo(0,0);
}
这应该将 WebView 内容设置回顶部,而不是在旧的滚动位置
编辑 1:
有时如果页面加载时间过长,这将无法正常工作,因此我们必须等待页面完全加载:
@Override
public void onPageFinished(WebView view, String url) {
view.postDelayed(new Runnable() {
@Override
public void run() {
webView.scrollTo(0, 0);
}
// Delay the scrollTo to make it work
}, 300);
}
请注意,这次的webView不是onPageFinished方法中的WebView,而是从布局中获取的WebView(与afterViews()方法中的相同)。
@Bojan Kopanja,对于误导我深表歉意。
事实证明,我将 webview 放在一个拉动中,以使用滚动视图刷新侦听器并删除它来解决问题。
尽管如此,还是感谢您的帮助。
我试图在点击应用 WebView 上的 link 时覆盖 url 加载。
页面加载但 WebView 将保持其上次滚动位置和内容大小。
我是否忘记在 WebView 上设置某些参数以在下次加载时重置内容大小和滚动位置?
以下是我的使用方法:
@SuppressLint("SetJavaScriptEnabled")
@AfterViews
protected void afterViews() {
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebClient());
webView.setWebChromeClient(new ChromeClient());
webView.loadUrl(url);
}
public class WebClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
boolean isValidEmail = url.startsWith("mailto:") && Patterns.EMAIL_ADDRESS.matcher(url.substring("mailto:".length())).matches();
boolean isValidPhone = url.startsWith("tel:") && Patterns.PHONE.matcher(url.substring("tel:".length())).matches();
if (url.startsWith("about:")) {
return super.shouldOverrideUrlLoading(view, url);
}
if (isValidEmail) {
Intent sendIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse(url));
startActivity(Intent.createChooser(sendIntent, ""));
} else {
if (isValidPhone) {
Intent dialIntent = new Intent(Intent.ACTION_DIAL, Uri.parse(url));
startActivity(Intent.createChooser(dialIntent, ""));
} else {
WebViewActivity.this.setPageTitle(url);
webView.loadUrl(url);
}
}
return true;
}
@Override
public void onPageFinished(WebView view, String url) {
//..
}
}
public class ChromeClient extends WebChromeClient {
@Override
public void onProgressChanged(WebView view, int progress) {
//...
}
}
谢谢。
您是否尝试在 onPageFinished 中设置滚动位置?
@Override
public void onPageFinished(WebView view, String url) {
// other code...
view.scrollTo(0,0);
}
这应该将 WebView 内容设置回顶部,而不是在旧的滚动位置
编辑 1:
有时如果页面加载时间过长,这将无法正常工作,因此我们必须等待页面完全加载:
@Override
public void onPageFinished(WebView view, String url) {
view.postDelayed(new Runnable() {
@Override
public void run() {
webView.scrollTo(0, 0);
}
// Delay the scrollTo to make it work
}, 300);
}
请注意,这次的webView不是onPageFinished方法中的WebView,而是从布局中获取的WebView(与afterViews()方法中的相同)。
@Bojan Kopanja,对于误导我深表歉意。 事实证明,我将 webview 放在一个拉动中,以使用滚动视图刷新侦听器并删除它来解决问题。 尽管如此,还是感谢您的帮助。