【问题标题】:progress bar in webview keeps loading even after web page finished loading即使网页完成加载,webview中的进度条也会继续加载
【发布时间】:2015-12-16 11:02:16
【问题描述】:

这是我的代码

import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;

@SuppressLint("SetJavaScriptEnabled")

public class MainActivity extends ActionBarActivity {

private WebView view;
private ProgressBar progressBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    progressBar = (ProgressBar) this.findViewById(R.id.progressBar);
    String url = "http://www.carsaleindiaofficial.com/?m=1";
    view = (WebView) this.findViewById(R.id.webView);
    view.setWebViewClient(new WebViewClient());
    view.getSettings().setJavaScriptEnabled(true);
    view.getSettings().setDomStorageEnabled(true);
    view.loadUrl(url);

}

public class MyAppWebViewClient extends WebViewClient {

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        view.findViewById(R.id.progressBar).setVisibility(View.GONE);


        //if (progressBar.getVisibility() == View.VISIBLE)
        //progressBar.setVisibility(View.INVISIBLE);

        //progressBar.setVisibility(View.INVISIBLE);
        //progressBar.setVisibility(View.GONE);


    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
    }


    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (Uri.parse(url).getHost().endsWith("carsaleindiaofficial.com/?m=1")) {
            return false;
        }

        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        view.getContext().startActivity(intent);
        return true;
    }

}


@Override
public void onBackPressed() {
    if (view.canGoBack()) {
        view.goBack();
    } else {
        super.onBackPressed();
    }
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    if (id == R.id.action_settings)
        view.loadUrl(view.getUrl());

    return super.onOptionsItemSelected(item);
    }
}

进度条和 webview 工作正常,但是页面加载完成后进度条仍然存在?当我加载页面时,进度条的可见性不会消失/更改为 GONE?错误在哪里? 我试过 progressBar.setVisibility(View.INVISIBLE) 和 progressBar.setVisibility(View.GONE);但似乎没有任何效果。

【问题讨论】:

  • 使用异步任务打开 webView 并在 onPostExecute() 中关闭你的peogress Dialogn
  • @Arjun Bajapi 看到我的答案。

标签: java android webview


【解决方案1】:

而不是使用自定义网络客户端。您使用默认的网络客户端。你的问题是替换这个。

view.setWebViewClient(new WebViewClient()); 

添加这个

view.setWebViewClient(new MyAppWebViewClient());

还有

 progressBar.setVisibility(View.INVISIBLE);

不是

view.findViewById(R.id.progressBar1).setVisibility(View.GONE);

完整代码

import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;

@SuppressLint("SetJavaScriptEnabled")

public class MainActivity extends ActionBarActivity {

private WebView view;
private ProgressBar progressBar;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_maine);

    progressBar = (ProgressBar) this.findViewById(R.id.progressBar1);
    String url = "http://www.carsaleindiaofficial.com/?m=1";
    view = (WebView) this.findViewById(R.id.webView1);
    view.setWebViewClient(new MyAppWebViewClient());
    view.getSettings().setJavaScriptEnabled(true);
    view.getSettings().setDomStorageEnabled(true);
    //view.loadUrl(url);
    view.loadUrl("http://m.facebook.com/");
   // view.loadUrl("file:///android_asset/web.html");

}

public class MyAppWebViewClient extends WebViewClient {

    @Override
    public void onPageFinished(WebView view, String url) {
        super.onPageFinished(view, url);
        //view.findViewById(R.id.progressBar1).setVisibility(View.GONE);
        Log.i("pageFinished", "yesss");
        progressBar.setVisibility(View.INVISIBLE);
        //progressBar.setVisibility(View.GONE);
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        super.onPageStarted(view, url, favicon);
    }


    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
       view.loadUrl(url);
       return true;
    }

}


@Override
public void onBackPressed() {
    if (view.canGoBack()) {
        view.goBack();
    } else {
        super.onBackPressed();
    }
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.maine, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    if (id == R.id.action_settings)
        view.loadUrl(view.getUrl());

    return super.onOptionsItemSelected(item);
    }
}

【讨论】:

  • 仍然没有运气.. :( 我尝试了一切。pb 要么继续加载,要么完全消失.. :( & using view.setWebViewClient(new MyAppWebViewClient()); 在浏览器中打开 url 不是在我的应用程序中。:(
  • 页面很重。您可以查看其他链接。
  • 我在注册页面的链接上检查了它.. 但它仍在加载.. 我用 dat 页面来愚弄人们.. 在那个页面上,普通人将无法弄清楚持续加载的错误..
  • 我无法理解我的代码有什么问题.. 作为一个简单的 progressBar.setVisibility(view.GONE) 应该可以完成工作.. :(
  • @ArjunBajpai 问题是 onPageFinished 没有被调用。检查更新的代码。
【解决方案2】:
 private class MyWebViewClient extends WebViewClient {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }

    @Override
    public void onPageFinished(WebView view, String url) {
        progressBar.setVisibility(View.GONE);
        FGallery.this.progressBar.setProgress(100);
        super.onPageFinished(view, url);
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) {
        progressBar.setVisibility(View.VISIBLE);
        FGallery.this.progressBar.setProgress(0);
        super.onPageStarted(view, url, favicon);
    }
}

这对我有用。你可以设置为WebViewClient

【讨论】:

    【解决方案3】:

    刚刚将 WebViewClient 更改为 MyWebViewClient,将progressBar 更改为progressBar1,将ActionBarActivity 更改为AppCompatActivity,并且每个代码似乎都可以正常工作:) 再次感谢every1.. :) @Devendra 和@akhil :)

    我的最终代码

    import android.annotation.SuppressLint;
    import android.graphics.Bitmap;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.widget.ProgressBar;
    
    @SuppressLint("SetJavaScriptEnabled")
    
    public class MainActivity extends  AppCompatActivity {
    
    
    
    private WebView view;
    private ProgressBar progressBar;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        progressBar = (ProgressBar) this.findViewById(R.id.progressBar1);
        String url = "http://www.carsaleindiaofficial.com/?m=1";
        view = (WebView) this.findViewById(R.id.webView);
        view.setWebViewClient(new MyWebViewClient());
        view.getSettings().setJavaScriptEnabled(true);
        view.getSettings().setDomStorageEnabled(true);
        view.loadUrl(url);
    
    }
    
        public class MyWebViewClient extends WebViewClient {
    
        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            Log.i("pageFinished", "yesss");
            progressBar.setVisibility(View.GONE);
            Log.i("progressBar", "Gone");
        }
    
        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            progressBar.setVisibility(View.VISIBLE);
            Log.i("progressBar", "Visible");
            super.onPageStarted(view, url, favicon);
        }
    
    
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            view.loadUrl(url);
            Log.i("ShldOvrideUrl", "working");
            return true;
        }
    
       }
    
    
    @Override
    public void onBackPressed() {
        if (view.canGoBack()) {
            view.goBack();
        } else {
            super.onBackPressed();
        }
    }
    
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
    
        int id = item.getItemId();
    
        if (id == R.id.action_settings)
            view.loadUrl(view.getUrl());
    
        return super.onOptionsItemSelected(item);
    }
    }
    

    【讨论】:

    • 它似乎工作,但我在这里遇到了一个小问题,当应用程序第一次加载(在第一页上加载)时进度条没有消失,而是在我移动到下一页之后,终于它消失了,是否可以在第一次加载时使进度条消失?还是不能?我的代码可能和你的一样,没有后退按钮
    【解决方案4】:

    在 webview url 的意图之后你必须写 progressbar.visibility="View.GONE"

    【讨论】:

    • progressbar.setVisibility="View.GONE"
    • 使用progressbar.Dismiss(); view.getContext().startActivity(intent) 之后;
    • 添加progressbar.setVisibility="View.GONE" 或progressbar.Dismiss();弹出一个错误说“无法解析方法”。同时添加progressBar.setVisibility(View.GONE);使进度条完全消失..
    • progressBar.dismiss();
    • 使用progressBar.dismiss();弹出一个错误说无法解析方法dismiss()
    猜你喜欢
    • 1970-01-01
    • 2015-06-16
    • 2019-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多