Android, как закрыть индикатор в методе onPageFinished () метода setWebViewClient ()? - PullRequest
0 голосов
/ 03 апреля 2012

В моей деятельности у меня есть Webview. Мне нужно показать Loading (индикатор выполнения), когда webview загружает страницу, и закрыть индикатор выполнения, когда загрузка страницы завершена. Я написал следующий код:

wvBrowser.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);

                progressBar = ProgressDialog.show(F1TrackCountryRaceTrackInfo.this, "", "Loading...");
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);

                progressBar.dismiss();
            }
        });

Когда я запускаю приложение в первый раз, все в порядке, но во второй раз приложение вылетает и logcat указывает на «progressBar.dismiss();» в «onPageFinished».

Я добавил метод onPause (), чтобы закрыть действие, и подумал, что, возможно, это решит проблему, но у меня все еще есть проблема.

@Override
    protected void onPause() {
        super.onPause();

        if(progressBar.isShowing())
            progressBar.dismiss();

        Toast.makeText(this, "Activity closed.", Toast.LENGTH_LONG).show();

        F1TrackCountryRaceTrackInfo.this.finish();
    }

В чем моя ошибка и как ее решить? Спасибо

Ошибка Logcat:

04-03 11: 14: 36.880: E / AndroidRuntime (19613): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное 04-03 11: 14: 36.880: E / AndroidRuntime (19613): java.lang.NullPointerException 04-03 11: 14: 36.880: E / AndroidRuntime (19613): в com.maxis.f12011.activities.F1TrackCountryRaceTrackInfo $ 1.onPageFinished (F1TrackCountryRaceTrackInfo.java:75) 04-03 11: 14: 36.880: E / AndroidRuntime (19613): в android.webkit.CallbackProxy.handleMessage (CallbackProxy.java:289) 04-03 11: 14: 36.880: E / AndroidRuntime (19613): в android.os.Handler.dispatchMessage (Handler.java:99) 04-03 11: 14: 36.880: E / AndroidRuntime (19613): в android.os.Looper.loop (Looper.java:130) 04-03 11: 14: 36.880: E / AndroidRuntime (19613): в android.app.ActivityThread.main (ActivityThread.java:3691) 04-03 11: 14: 36.880: E / AndroidRuntime (19613): в java.lang.reflect.Method.invokeNative (родной метод) 04-03 11: 14: 36.880: E / AndroidRuntime (19613): в java.lang.reflect.Method.invoke (Method.java:507) 04-03 11: 14: 36.880: E / AndroidRuntime (19613): в com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:907) 04-03 11: 14: 36.880: E / AndroidRuntime (19613): в com.android.internal.os.ZygoteInit.main (ZygoteInit.java:665) 04-03 11: 14: 36.880: E / AndroidRuntime (19613): в dalvik.system.NativeStart.main (собственный метод)

Ответы [ 5 ]

0 голосов
/ 24 января 2017

Старый вопрос, но вот как я это сделал.

Создание и настройка индикатора выполнения и WebView:

private WebView myWebView;
private ProgressBar myProgressBar;

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(activity_web);

    myWebView = (WebView) findViewById(R.id.ib_web_wv_main);
    myProgresBar = (ProgressBar) findViewById(R.id.ib_web_progressbar);

}

Сделать индикатор выполнения видимым и невидимым при необходимости:

myWebView.setWebViewClient(new WebViewClient(){

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon){

         myProgressBar.setVisibility(View.VISIBLE);
   }

   @Override
   public void onPageFinished(WebView view, String url) {
           myProgressBar.setVisibility(View.INVISIBLE);
        }

    });
0 голосов
/ 04 апреля 2012

попробуйте это работает нормально ..

private WebView webview;
    ProgressDialog dialog;

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




        webview = (WebView) findViewById(R.id.webview);

         dialog = new ProgressDialog(classname.this);
          dialog.setMessage("Loading......");
          dialog.setIndeterminate(true);
          dialog.setCancelable(true);
          dialog.show();

        webview.getSettings().setJavaScriptEnabled(true);       
        webview.setWebViewClient(new WebviewUrl());
        webview.loadUrl(your url here...);
    }   


    public class WebviewUrl extends WebViewClient  
    {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) 
        {
            view.loadUrl(url);
            return true;
        }
        @Override
        public void onPageFinished(WebView view, String url) 
        {
            // TODO Auto-generated method stub
            super.onPageFinished(view, url);
             if (dialog.isShowing())
             {
                dialog.dismiss();
              }
        }
    }
0 голосов
/ 03 апреля 2012

Я экспортировал «progressBar = ProgressDialog.show(F1TrackCountryRaceTrackInfo.this, "", "Loading...");» из onPageStarted () и поместил его в метод oncreate (), и проблема решена. Теперь каждый раз, когда загрузка началась, активность будет отображаться до тех пор, пока веб-просмотр не загрузит страницу, а затем onPageFinished () закроет панель загрузки.

0 голосов
/ 04 апреля 2012

Основная проблема здесь в том, что onPageStarted(WebView view, String url, Bitmap favicon) метод вызывается один раз для каждой загрузки основного кадра, поэтому страница с iframes или framesets будет вызывать onPageStarted один раз для основного кадра. Это также означает, что onPageStarted не будет вызываться при изменении содержимого встроенного фрейма, т. Е. По ссылке, целью которой является фрейм iframe. см. Здесь

Таким образом, прогрессбар создается только в первый раз, а в следующий раз - нет. Проблема вызывает вызов dismiss () в null.

0 голосов
/ 03 апреля 2012

попробуйте поместить progressBar.dismiss(); перед super.onPageFinished(view, url); в методе onPageFinished.

...