Fragment中WebView添加ProgressBar遇异常:始终显示灰线求助
排查Fragment中WebView搭配ProgressBar出现异常浅灰线的问题
我仔细看了你的代码和描述,那条浅灰线大概率是ProgressBar未被正确控制显示/隐藏导致的,核心问题出在你自定义的MyWebViewClient根本没被用上!
问题1:自定义WebViewClient未绑定到WebView
你在代码里定义了MyWebViewClient,里面写了页面加载开始时显示ProgressBar、加载完成时隐藏的逻辑,但实际给WebView设置的是默认的new WebViewClient(),这就导致你写的控制逻辑完全没触发。ProgressBar一直处于初始状态(比如布局里默认是显示的),那条浅灰线就是它的默认样式残留。
修复步骤
- 替换WebViewClient为自定义实现
把这行代码:
webView.setWebViewClient(new WebViewClient());
改成:
webView.setWebViewClient(new MyWebViewClient());
- 确保ProgressBar初始状态为隐藏
打开你的fragment_home.xml布局文件,给ProgressBar添加初始隐藏属性:
<ProgressBar android:id="@+id/progress" ... android:visibility="gone" />
如果布局里没设置这个属性,ProgressBar会默认显示,即使页面加载完成也不会自动隐藏。
- 优化ProgressBar样式(可选但推荐)
默认的水平ProgressBar在未设置进度时可能会显示一条浅灰线,你可以给它设置明确的样式和进度Drawable来避免这个问题:
<ProgressBar android:id="@+id/progress" style="?android:attr/progressBarStyleHorizontal" android:layout_width="match_parent" android:layout_height="2dp" android:visibility="gone" android:progressDrawable="@drawable/custom_progress_bar" />
(你可以自己创建custom_progress_bar.xml来定义进度条的颜色和背景,避免默认样式的灰色残留)
补充优化的代码片段
修改后的onCreateView方法:
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { homeViewModel = ViewModelProviders.of(this).get(HomeViewModel.class); View rootView = inflater.inflate(R.layout.fragment_home, container, false); Bundle bundle = this.getArguments(); progressBar = (ProgressBar) rootView.findViewById(R.id.progress); // 主动设置初始隐藏,双重保险 progressBar.setVisibility(View.GONE); if(bundle != null){ value = getArguments().getString("Key"); Log.i("Details",value); } webView = (WebView) rootView.findViewById(R.id.webView); // 绑定自定义WebViewClient webView.setWebViewClient(new MyWebViewClient()); webView.getSettings().setJavaScriptEnabled(true); webView.loadUrl(value); Log.i("Details2",value); return rootView; }
优化后的MyWebViewClient(增加错误处理,避免加载失败时ProgressBar一直显示):
private class MyWebViewClient extends WebViewClient { @Override public boolean shouldOverrideUrlLoading(WebView view, String value) { view.loadUrl(value); return true; } @Override public void onPageStarted(final WebView view, final String value, final Bitmap favicon) { progressBar.setVisibility(View.VISIBLE); progressBar.setProgress(0); // 重置进度,避免上次加载的进度残留 super.onPageStarted(view, value, favicon); } @Override public void onPageFinished(WebView view, String value) { progressBar.setVisibility(View.GONE); super.onPageFinished(view, value); } @Override public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { progressBar.setVisibility(View.GONE); // 加载失败也隐藏进度条 super.onReceivedError(view, errorCode, description, failingUrl); // 这里可以添加加载失败的提示逻辑,比如显示错误页面 } }
按照上面的步骤修改后,那条浅灰线应该就会消失,ProgressBar也会正常跟随页面加载状态显示/隐藏了。
内容的提问来源于stack exchange,提问作者Rahul Saini
相关产品推荐
相关产品推荐

