Android:Fragment中WebView的ProgressBar不显示问题求助
解决WebView加载前空白、ProgressBar不显示的问题
嘿,我帮你梳理下问题的根源,然后一步步解决:
1. 最核心的问题:ProgressBar被WebView挡住了
看你的布局代码,用的是RelativeLayout,而WebView是在ProgressBar之后声明的——在RelativeLayout里,后声明的View层级更高,会完全覆盖在前面的View上面,所以你的ProgressBar其实一直存在,但被WebView完全挡住了,根本看不到!
解决这个的最佳方式是换成FrameLayout(这种上下覆盖的场景用FrameLayout最顺手),调整布局如下:
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".FragmentThree"> <!-- 底层放WebView --> <WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" /> <!-- 上层放进度条,默认显示在顶部 --> <ProgressBar android:id="@+id/progressbar" style="@style/Widget.AppCompat.ProgressBar.Horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="top" /> </FrameLayout>
我把进度条改成了水平样式,这样用户能直观看到加载进度,如果你偏好圆形进度条,把style改回原来的就行,记得调整布局位置让它居中。
2. 完善ProgressBar的显示/隐藏逻辑
你只给进度条设置了进度值,但没处理它的显示状态:加载开始时要显示,加载完成后要隐藏。同时给WebView加一些基础配置,加快加载速度,减少空白时间:
private void initMain(View view) { webView = view.findViewById(R.id.webview); progressBar = view.findViewById(R.id.progressbar); progressBar.setMax(100); // 一开始先显示进度条 progressBar.setVisibility(View.VISIBLE); // 配置WebView,优化加载体验 WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); // 大部分现代网页依赖JS webSettings.setDomStorageEnabled(true); webSettings.setLoadWithOverviewMode(true); webSettings.setUseWideViewPort(true); webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); // 开启缓存,重复加载更快 webView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); // 页面开始加载时显示进度条 progressBar.setVisibility(View.VISIBLE); } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); // 页面加载完成后隐藏进度条 progressBar.setVisibility(View.GONE); } }); webView.setWebChromeClient(new WebChromeClient(){ @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); progressBar.setProgress(newProgress); // 保险起见,进度到100也隐藏进度条 if(newProgress == 100){ progressBar.setVisibility(View.GONE); } } }); webView.loadUrl(URL); }
3. 修复Fragment的参数传递问题(隐藏坑)
你现在的Fragment用了带参构造函数,这在Android里是不推荐的——当Fragment因为配置变化(比如旋转屏幕)重建时,系统会调用无参构造,你的URL参数会丢失,导致WebView加载失败。换成静态工厂方法的方式更安全:
// 删掉原来的带参构造,换成静态工厂方法 public static FragmentThree newInstance(String url) { FragmentThree fragment = new FragmentThree(); Bundle args = new Bundle(); args.putString("WEB_URL", url); fragment.setArguments(args); return fragment; } // 保留无参构造 public FragmentThree() { // Required empty public constructor } // 在onCreateView里获取参数 @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_three, container, false); // 从Bundle里取URL if (getArguments() != null) { URL = getArguments().getString("WEB_URL"); } initMain(view); return view; }
4. 减少进入Fragment时的空白时间
如果还是觉得空白时间长,可以给WebView设置一个默认背景色,或者在加载前显示一个占位布局,比如和APP主题一致的背景,让用户感觉不是“卡了”。
内容的提问来源于stack exchange,提问作者digdigdoot
相关产品推荐
相关产品推荐

