Как реализовать диалог прогресса в веб-просмотре перед загрузкой изображения?

1

У меня есть webview в моем приложении, которое должно загружать изображение, оно загружает его в порядке, однако для его отображения требуется несколько секунд. Поэтому мне нужно показать диалог прогресса, чтобы информировать пользователя о загрузке страницы. (это изображение загружается из папки с ресурсами, а не из Интернета). Это мой код sofar, но сбой при попытке запустить эту активность.

public MapsFragment(){}
ProgressDialog progress;
WebView myWebView;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    View rootView = inflater.inflate(R.layout.fragment_maps, container, false);

    WebView webview = (WebView)rootView.findViewById(R.id.webView2);
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setLoadWithOverviewMode(true);
    webview.getSettings().setBuiltInZoomControls(true);
    webview.getSettings().setUseWideViewPort(false);
    webview.loadUrl("file:///android_asset/index1.html");

    webview.setWebViewClient(new WebViewClient(){
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            progress.show();
            view.loadUrl(url);
            return true;                
        }
        @Override
        public void onPageFinished(WebView view, final String url) {
            progress.dismiss();
        }
    });

    return rootView;
 }
}

И тогда код ошибки для этого:

11-08 13:19:34.034: E/AndroidRuntime(20600): FATAL EXCEPTION: main
11-08 13:19:34.034: E/AndroidRuntime(20600): Process: com.test.testguide, PID: 20600
11-08 13:19:34.034: E/AndroidRuntime(20600): java.lang.NullPointerException
11-08 13:19:34.034: E/AndroidRuntime(20600):    at com.test.testguide.MapsFragment$1.onPageFinished(MapsFragment.java:42)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at com.android.webview.chromium.WebViewContentsClientAdapter.onPageFinished(WebViewContentsClientAdapter.java:449)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at com.android.org.chromium.android_webview.AwContentsClient$AwWebContentsObserver$1.run(AwContentsClient.java:73)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at android.os.Handler.handleCallback(Handler.java:733)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at android.os.Handler.dispatchMessage(Handler.java:95)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at    android.os.Looper.loop(Looper.java:136)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at android.app.ActivityThread.main(ActivityThread.java:5586)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at java.lang.reflect.Method.invokeNative(Native Method)
11-08 13:19:34.034: E/AndroidRuntime(20600):    at java.lang.reflect.Method.invoke(Method.java:515)

Пожалуйста, помогите, поскольку у меня было столько вопросов по этому вопросу, и я не мог найти решение.
Спасибо!

РЕДАКТИРОВАТЬ

Я исправил ошибку с помощью myWebView и вернулся к webview, что привело к новой ошибке. См. Обновленный вопрос

EDIT2

@Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            progress = new ProgressDialog(getActivity());
            progress.setMessage("Please wait...");
            progress.setIndeterminate(false);
            progress.setCancelable(false);
            progress.show();
            view.loadUrl(url);
            return true;                
        }
        @Override
        public void onPageFinished(WebView view, final String url) {
            progress.dismiss();
        }
    });

Но это все еще, похоже, падает с одинаковыми ошибками

  • 0
    Вы не инициализировали свой диалог прогресса ... попробуйте инициализировать его и запустить
  • 0
    Как мне начать инициализацию?
Показать ещё 5 комментариев
Теги:
android-webview

4 ответа

2
Лучший ответ

Вы не инициализировали свой диалог прогресса,

progress= ProgressDialog.show(this, "Title","Message", true);

или,

        progress= new ProgressDialog(getActivity());
        progress.setMessage("Please wait...");
        progress.setIndeterminate(false);
        progress.setCancelable(false);
        progress.show();

и вы можете вызвать progress.dismiss(), чтобы скрыть диалог

РЕДАКТИРОВАТЬ

View rootView = inflater.inflate(R.layout.fragment_maps, container, false);
WebView webview = (WebView)rootView.findViewById(R.id.webView2);
webview.getSettings().setJavaScriptEnabled(true);
webview.getSettings().setLoadWithOverviewMode(true);
webview.getSettings().setBuiltInZoomControls(true);
webview.getSettings().setUseWideViewPort(false);
webview.loadUrl("file:///android_asset/index1.html");
progress= new ProgressDialog(getActivity());
webview.setWebViewClient(new WebViewClient(){
  @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        progress.setMessage("Please wait...");
        progress.setIndeterminate(false);
        progress.setCancelable(false);
        progress.show();
        view.loadUrl(url);
        return true;                
    }
    @Override
    public void onPageFinished(WebView view, final String url) {
        progress.dismiss();
    }
});

return rootView;
}
  • 0
    это все еще дает мне ошибку в onPageFinished (исключение Null Pointer) Так что я думаю, что есть проблема в @Override public void onPageFinished(WebView view, final String url) { progress.dismiss();
  • 0
    put progress = new ProgressDialog (getActivity ()); перед webview.setWebViewClient (new WebViewClient () {эту строку и попробуйте снова
Показать ещё 3 комментария
0

Я сделал что-то похожее, чтобы показать сообщение, когда страница начинает загружаться и закрывать ее, когда она заканчивается:

package com.veemesoft.radiostream.radiostream;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ImageButton;
import android.widget.TextView;
public class WebViewActivity extends Activity {

    private WebView webView;
    ImageButton goBack;
    TextView webViewTitle;
    ProgressDialog progressDialog;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_web_view);
        webViewTitle = (TextView) findViewById(R.id.web_view_title);
        String webViewTitleString = this.getIntent().getStringExtra("web_view_title");
        webViewTitle.setText(webViewTitleString);
        goBack = (ImageButton) findViewById(R.id.go_back);

        goBack.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                goToMainActivity();
            }
        });

        webView = (WebView) findViewById(R.id.webView);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.getSettings().setLoadWithOverviewMode(true);
        webView.getSettings().setBuiltInZoomControls(true);
        webView.getSettings().setUseWideViewPort(false);
        progressDialog = new ProgressDialog(this);
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                progressDialog.setMessage("Espere unos segundos...");
                progressDialog.setIndeterminate(true);
                progressDialog.setCancelable(false);
                progressDialog.show();
            }

            @Override
            public void onPageFinished(WebView view, final String url) {
                progressDialog.dismiss();
            }
        });
        String url = this.getIntent().getStringExtra("url");
        webView.loadUrl(url);
    }

    private void goToMainActivity(){
        finish();
    }
}
0

u может сделать что-то подобное, когда ур загружает ресурсы

public boolean shouldOverrideUrlLoading (представление WebView, строковый URL) {
view.loadUrl(URL); return true; }

    public void onLoadResource (WebView view, String url) {
        if (progressDialog == null) {
            progressDialog = new ProgressDialog(activity);
            progressDialog.setMessage("Loading... ");
            progressDialog.show();
        }
    }
  • 0
    и как бы вы отклонили этот диалог прогресса ...?
  • 0
    чем вам нужно реализовать didloadrequest или didfailed, потому что в любом случае вы хотите остановить свой прогресс
0

Я использовал в своем WebView который может вам помочь:

установить WebChromeClient в onCreate() как

webView.setWebChromeClient(new MyWebChromeClient());

class MyWebChromeClient extends WebChromeClient {

    ProgressDialog pDialog;

    public MyWebChromeClient() {
        // TODO Auto-generated constructor stub
        pDialog = new ProgressDialog(YourActivity.this); //Use getActivity(); for Fragment
        pDialog.setMessage("Loading...");
        pDialog.setCancelable(false);
        pDialog.setProgress(0);
        pDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

    }

    public void onProgressChanged(WebView view, int progress) 
    {
        if(progress < 100 && !pDialog.isShowing()){
            pDialog.show();
        }
        pDialog.setProgress(progress);
        if(progress == 100) {
            pDialog.dismiss();
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню