Webview中的进度条在网页加载完成后仍然持续加载。

3

这是我的代码

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);
    }
}

进度条和网页视图都正常工作,但当页面加载完成时,进度条仍然存在?当我加载完页面后,进度条的可见性没有消失或更改为GONE?错误在哪里? 我已经尝试了progressBar.setVisibility(View.INVISIBLE)和progressBar.setVisibility(View.GONE);但好像没有任何作用。

使用async Task打开webView,并在onPostExecute()中关闭进度对话框。 - android_softy
@Arjun Bajapi,请看我的回答。 - arun
4个回答

1

不要使用定制的Web客户端,而是使用默认的Web客户端。您的问题是替换它。

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一直在加载,要么完全消失了.. :( 而且使用 view.setWebViewClient(new MyAppWebViewClient()); 会在浏览器而不是我的应用程序中打开url。:( - IndianRaptor
我在 LinkedIn 注册页面进行了测试,但它仍在加载中。我使用了那个页面来愚弄人们。在该页面上,普通人无法发现持续加载的错误。 - IndianRaptor
我不明白我的代码有什么问题... 一个简单的progressBar.setVisibility(view.GONE)应该可以解决问题.. :( - IndianRaptor
等待页面加载完成。在我的仿真器上需要15分钟。该页面非常重。 - arun
非常感谢 @arun,你更新后的代码运行正常... :) - IndianRaptor
显示剩余2条评论

1

我刚刚将WebViewClient更改为MyWebViewClient,progressBar更改为progressBar1,ActionBarActivity更改为AppCompatActivity,所有代码似乎都可以工作:) 再次感谢每个人.. :) @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);
}
}

看起来它能工作,但我在这里遇到了一个小问题。当应用程序首次加载(在第一页上加载)时,进度条没有消失,而是在我移动到下一页后最终消失了。是否有可能使进度条在第一次加载时消失?还是不可能?我的代码与你的代码很相似,只是没有返回按钮。 - unknown.person

0

在webview的意图之后,您需要编写progressbar.visibility="View.GONE"


progressbar.setVisibility="View.GONE" - akhil batlawala
在 view.getContext().startActivity(intent); 之后使用 progressbar.Dismiss(); - akhil batlawala
progressBar.dismiss(); - akhil batlawala
mProgressDialog = ProgressDialog.show(getActivity(), "", "正在恢复数据,请稍候..."); 动态添加进度对话框。在 WebView 内容显示后添加 mProgressDialog.dismiss(); 这对我很有效。 - akhil batlawala
使用此代码替换getActivity() - akhil batlawala
显示剩余7条评论

0
 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接