WebView进度条与加载文本不显示问题求助
Hey there! Let's work through those two WebView problems you're dealing with—progress bar/loading text not showing up, and the same issue happening when clicking links in local HTML files. Here's what's likely going wrong and how to fix it:
1. Why Progress Bar & Loading Text Aren't Showing Up
The most common culprit here is not using a WebChromeClient to listen for loading progress. WebView relies on this client to trigger progress updates, while WebViewClient handles page navigation events. You also need to make sure your layout includes the progress bar and loading text, and that you're properly toggling their visibility.
Step 1: Verify Your Layout (activity_main.xml)
First, double-check that you've added the progress bar and loading text to your layout, positioned correctly with the WebView:
<!-- Add these above your WebView in the layout --> <ProgressBar android:id="@+id/progressBar" android:layout_width="match_parent" android:layout_height="3dp" android:visibility="gone" style="?android:attr/progressBarStyleHorizontal"/> <TextView android:id="@+id/loadingText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Loading..." android:visibility="gone" android:layout_centerInParent="true"/> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent"/>
Step 2: Update Your MainActivity Code
Initialize the new UI elements, configure WebView settings, and attach the WebChromeClient to track progress:
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { WebView wv; ProgressBar progressBar; TextView loadingText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Initialize all UI elements wv = findViewById(R.id.webView); progressBar = findViewById(R.id.progressBar); loadingText = findViewById(R.id.loadingText); // Configure WebView settings for local files and JS support WebSettings webSettings = wv.getSettings(); webSettings.setJavaScriptEnabled(true); // Enable if your HTML uses JS webSettings.setDomStorageEnabled(true); webSettings.setAllowFileAccess(true); // Critical for local HTML links // Track loading progress with WebChromeClient wv.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { super.onProgressChanged(view, newProgress); if (newProgress == 100) { // Hide progress elements when loading completes progressBar.setVisibility(View.GONE); loadingText.setVisibility(View.GONE); } else { // Show and update progress bar progressBar.setVisibility(View.VISIBLE); progressBar.setProgress(newProgress); loadingText.setVisibility(View.VISIBLE); } } }); // Load your local HTML file (adjust path to match your assets file) wv.loadUrl("file:///android_asset/your_local_page.html"); // Rest of your existing Toolbar/NavigationView code... Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); // ... } // Implement NavigationView listener @Override public boolean onNavigationItemSelected(@NonNull MenuItem item) { // Your existing navigation logic here return true; } // Clean up WebView to avoid memory leaks @Override protected void onDestroy() { if (wv != null) { wv.destroy(); wv = null; } super.onDestroy(); } }
2. Fixing Progress Bar for Local HTML Links
When clicking links in local HTML, the progress bar might not show up if WebView is opening the link in an external browser instead of itself. To fix this, add a WebViewClient to intercept link clicks and load them inside your WebView:
Add this code right after setting the WebChromeClient:
wv.setWebViewClient(new WebViewClient() { @Override public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { // Force all links to load inside the WebView view.loadUrl(request.getUrl().toString()); return true; } @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); // Ensure progress elements are visible when a new page starts loading progressBar.setVisibility(View.VISIBLE); loadingText.setVisibility(View.VISIBLE); } });
Key Notes to Remember
- ProgressBar Style: Use
?android:attr/progressBarStyleHorizontalto get a horizontal bar that shows progress visually. - Local File Permissions: If your HTML accesses files outside the
assetsfolder, you may need to request storage permissions (Android 10+ requires special handling for scoped storage). - Memory Leaks: Always destroy the WebView in
onDestroy()to prevent memory issues.
内容的提问来源于stack exchange,提问作者abhilash kaveriappa

