如何在WebView中无需等待页面完全加载就隐藏进度条?
实现WebView首次加载完成后隐藏进度条
Kotlin 实现
先在布局文件中定义WebView和进度条:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <ProgressBar android:id="@+id/progressBar" android:layout_width="match_parent" android:layout_height="4dp" android:indeterminate="false" android:max="100" style="?android:attr/progressBarStyleHorizontal"/> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent"/> </LinearLayout>
然后在Activity中实现逻辑:
class WebViewActivity : AppCompatActivity() { private lateinit var webView: WebView private lateinit var progressBar: ProgressBar private var isFirstLoadCompleted = false // 标记首次加载状态 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_web_view) webView = findViewById(R.id.webView) progressBar = findViewById(R.id.progressBar) // 配置WebView基础参数 webView.settings.javaScriptEnabled = true webView.settings.loadWithOverviewMode = true webView.settings.useWideViewPort = true // 监听加载进度,仅首次加载时更新进度条 webView.webChromeClient = object : WebChromeClient() { override fun onProgressChanged(view: WebView?, newProgress: Int) { super.onProgressChanged(view, newProgress) if (!isFirstLoadCompleted) { progressBar.progress = newProgress } } } // 监听页面加载完成,首次加载完成后隐藏进度条 webView.webViewClient = object : WebViewClient() { override fun onPageFinished(view: WebView?, url: String?) { super.onPageFinished(view, url) if (!isFirstLoadCompleted) { progressBar.visibility = View.GONE isFirstLoadCompleted = true // 更新标记,后续加载不再触发隐藏逻辑 } } } // 加载目标页面 webView.loadUrl("https://your-target-url.com") } }
Java 实现
布局文件和Kotlin示例一致,Activity代码如下:
public class WebViewActivity extends AppCompatActivity { private WebView webView; private ProgressBar progressBar; private boolean isFirstLoadCompleted = false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_web_view); webView = findViewById(R.id.webView); progressBar = findViewById(R.id.progressBar); // 配置WebView基础参数 WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setLoadWithOverviewMode(true); webSettings.setUseWideViewPort(true); // 监听加载进度,仅首次加载时更新进度条 webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); if (!isFirstLoadCompleted) { progressBar.setProgress(newProgress); } } }); // 监听页面加载完成,首次加载完成后隐藏进度条 webView.setWebViewClient(new WebViewClient() { @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); if (!isFirstLoadCompleted) { progressBar.setVisibility(View.GONE); isFirstLoadCompleted = true; } } }); // 加载目标页面 webView.loadUrl("https://your-target-url.com"); } }
关键说明
- 核心是通过
isFirstLoadCompleted布尔变量标记首次加载状态,确保只有第一次页面加载完成时才隐藏进度条,WebView内部后续的页面跳转不会再触发该逻辑。 - 如果需要调整进度条样式,可修改布局中ProgressBar的
style属性,比如换成圆形进度条。
内容的提问来源于stack exchange,提问作者Talha Saglam
相关产品推荐
相关产品推荐

