Android: How can i show progress bar while loading data into WebView?

后端 未结 4 1914
失恋的感觉
失恋的感觉 2021-01-06 10:21

How can I show the progress bar while loading data into my webview? My code :

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInsta         


        
相关标签:
4条回答
  • 2021-01-06 11:01
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            final ProgressBar progress = (ProgressBar) findViewById(R.id.progress);
    
            WebView webView = (WebView) findViewById(R.id.webview);
            webView.getSettings().setJavaScriptEnabled(true);
            webView.setWebViewClient(new WebViewClient() {
                @Override
                public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
                    return false;
                }
    
                @Override
                public void onPageStarted(final WebView view, final String url, final Bitmap favicon) {
                    progress.setVisibility(View.VISIBLE);
                    super.onPageStarted(view, url, favicon);
                }
    
                @Override
                public void onPageFinished(final WebView view, final String url) {
                    progress.setVisibility(View.GONE);
                    super.onPageFinished(view, url);
                }
            });
    
            webView.loadUrl("http://google.com");
        }
    }
    

    And R.layout.activity_main:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="match_parent"
         android:layout_height="match_parent">
    
        <WebView
            android:id="@+id/webview"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    
        <ProgressBar
            android:id="@+id/progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:layout_centerInParent="true"/>
    </RelativeLayout>
    
    0 讨论(0)
  • 2021-01-06 11:10

    First make custom webview class and use it on xml like this,

     <com.app.ui.views.CustomWebView
            android:id="@+id/webView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            >
    
        </com.app.ui.views.CustomWebView>
    

    Make sure, the height should not be fixed, it should be "wrap_content"

    Now make custom webview class like this,

     public class CustomWebView extends WebView {
    
        private ProgressBar progressBar;
        private Context context;
        private LinearLayout loaderLayout;
    
        public CustomWebView(Context context) {
        super(context);
    
        this.context = context;
        initProgressBar();
    
        loadUrlWithData();
    
    }
    
    public CustomWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
    
        this.context = context;
        initProgressBar();
    
    }
    
    public CustomWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    
        this.context = context;
    
        initProgressBar();
    
    }
    
    private void initProgressBar() {
        progressBar = new ProgressBar(context);
        progressBar.setIndeterminate(false);
    
    }
    
    private void setLoading(boolean isLoading) {
    
      if (isLoading) {
    
       progressBar.setVisibility(View.VISIBLE);
    
       loaderLayout = new LinearLayout(context);
       loaderLayout.setGravity(Gravity.CENTER);
       loaderLayout.setOrientation(LinearLayout.HORIZONTAL);
    
        LinearLayout.LayoutParams parentLayoutParams = new LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.MATCH_PARENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT);
            loaderLayout.setLayoutParams(parentLayoutParams);
    
            LinearLayout.LayoutParams progressBarLayoutParams = new 
            LinearLayout.LayoutParams(75, 75);
            progressBar.setLayoutParams(progressBarLayoutParams);
    
            if (progressBar.getParent() != null) {
                ((ViewGroup) progressBar.getParent()).removeView(progressBar);
            }
            loaderLayout.addView(progressBar);
    
            // add this loaderLayout to your parent view in which your webview is added
    
            else {
    
               progressBar.setVisibility(View.GONE);
            }
    
      }
    
      private void loadUrlWithData(){
         setLoading(true);
         //Load your HTML data with url here
    
      }
    
     //When the content will be loaded, the webview will change it's height
     @Override
    protected void onSizeChanged(int w, int h, int ow, int oh) {
        super.onSizeChanged(w, h, ow, oh);
    
        if (h > 400) {
            setLoading(false);
        }
    }
    
    }
    
    0 讨论(0)
  • 2021-01-06 11:15

    Before calling loadData() function, just try to show ProgressDialog or put ProgressBar inside layout.

    And inside the WebViewClient, just dismiss() the progressDialog or make the ProgressBar invisible.

    for example:

    // when finish loading page
    public void onPageFinished(WebView view, String url) {
           if(mProgress.isShowing()) {
                 mProgress.dismiss();
           }
    }
    

    FYI, call loadData() or loadURL() only after you are done with web client setting.

    check this example: Load WebView with ProgressDialog

    0 讨论(0)
  • 2021-01-06 11:24

    Please try following code,

    ProgressDialog progDailog = ProgressDialog.show( context,"Process ", "Loading Data...",true,true);
    
    new Thread ( new Runnable()
    {
         public void run()
         {
          // your data loading code goes here
         }
    }).start();
    
     Handler progressHandler = new Handler() 
     {
    
         public void handleMessage(Message msg1) 
         {
    
             progDailog.dismiss();
             }
     }
    
    0 讨论(0)
提交回复
热议问题