Android Studio 中 WebView 内部链接的进度条
Progress bar for internal links of a WebView in Android Studio
我有一个使用 Android Studio 开发的 WebView。我想在 WebView 的每个内部页面上实现一个进度条。
我给你看代码。虽然我必须澄清一下,应用程序已经有一个进度条,它完成了启动画面的功能。
我想要的是,当在 WebView 中打开 link 时,会出现一个进度条,指示页面正在加载,因为当打开 link 时,用户的屏幕会瘫痪几秒钟直到它完全加载,这对肉眼来说可能很烦人。
初步代码:
MainActivity
package com.example.app;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.ProgressBar;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
String ShowOrHideWebViewInitialUse = "show";
private ProgressBar spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webview = (WebView) findViewById(R.id.webView);
spinner = (ProgressBar) findViewById(R.id.progressBar1);
webview.setWebViewClient(new CustomWebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.setOverScrollMode(WebView.OVER_SCROLL_NEVER);
webview.loadUrl("https://www.example.com");
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
WebView miVisorWeb;
miVisorWeb = (WebView) findViewById(R.id.webView);
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
if (miVisorWeb.canGoBack()) {
miVisorWeb.goBack();
} else {
finish();
}
return true;
}
}
return super.onKeyDown(keyCode, event);
}
private class CustomWebViewClient extends WebViewClient {
@Override
public void onPageStarted(WebView webview, String url, Bitmap favicon) {
if (ShowOrHideWebViewInitialUse.equals("show")) {
webview.setVisibility(View.INVISIBLE);
}
}
@Override
public void onPageFinished(WebView view, String url) {
ShowOrHideWebViewInitialUse = "hide";
spinner.setVisibility(View.GONE);
view.setVisibility(View.VISIBLE);
super.onPageFinished(view, url);
}
}
}
如果您可以实现另一个不会填满整个屏幕的进度条,这将是一个很大的帮助,当在 WebView 中加载 link 时显示,然后在加载完成时消失。
非常感谢!
您可以通过更改样式使用水平条代替 Spinner 进度条。
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
--- other attributes here ---
/>
将这个水平进度条放在 webview 的顶部,类似于下图。
此外,通过将chromeWebClient
设置到webview并覆盖onProgressChanged
方法,我们可以获得页面加载的进度,可以将其设置为水平进度条。
webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int newProgress) {
progressBar.setProgressCompat(newProgress, true)
}
});
我有一个使用 Android Studio 开发的 WebView。我想在 WebView 的每个内部页面上实现一个进度条。
我给你看代码。虽然我必须澄清一下,应用程序已经有一个进度条,它完成了启动画面的功能。
我想要的是,当在 WebView 中打开 link 时,会出现一个进度条,指示页面正在加载,因为当打开 link 时,用户的屏幕会瘫痪几秒钟直到它完全加载,这对肉眼来说可能很烦人。
初步代码:
MainActivity
package com.example.app;
import android.os.Bundle;
import android.view.KeyEvent;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.graphics.Bitmap;
import android.view.View;
import android.widget.ProgressBar;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
String ShowOrHideWebViewInitialUse = "show";
private ProgressBar spinner;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webview = (WebView) findViewById(R.id.webView);
spinner = (ProgressBar) findViewById(R.id.progressBar1);
webview.setWebViewClient(new CustomWebViewClient());
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setDomStorageEnabled(true);
webview.setOverScrollMode(WebView.OVER_SCROLL_NEVER);
webview.loadUrl("https://www.example.com");
}
public boolean onKeyDown(int keyCode, KeyEvent event) {
WebView miVisorWeb;
miVisorWeb = (WebView) findViewById(R.id.webView);
if (event.getAction() == KeyEvent.ACTION_DOWN) {
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
if (miVisorWeb.canGoBack()) {
miVisorWeb.goBack();
} else {
finish();
}
return true;
}
}
return super.onKeyDown(keyCode, event);
}
private class CustomWebViewClient extends WebViewClient {
@Override
public void onPageStarted(WebView webview, String url, Bitmap favicon) {
if (ShowOrHideWebViewInitialUse.equals("show")) {
webview.setVisibility(View.INVISIBLE);
}
}
@Override
public void onPageFinished(WebView view, String url) {
ShowOrHideWebViewInitialUse = "hide";
spinner.setVisibility(View.GONE);
view.setVisibility(View.VISIBLE);
super.onPageFinished(view, url);
}
}
}
如果您可以实现另一个不会填满整个屏幕的进度条,这将是一个很大的帮助,当在 WebView 中加载 link 时显示,然后在加载完成时消失。
非常感谢!
您可以通过更改样式使用水平条代替 Spinner 进度条。
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
--- other attributes here ---
/>
将这个水平进度条放在 webview 的顶部,类似于下图。
此外,通过将chromeWebClient
设置到webview并覆盖onProgressChanged
方法,我们可以获得页面加载的进度,可以将其设置为水平进度条。
webView.setWebChromeClient(new WebChromeClient() {
public void onProgressChanged(WebView view, int newProgress) {
progressBar.setProgressCompat(newProgress, true)
}
});