У меня есть 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();
}
});
Но это все еще, похоже, падает с одинаковыми ошибками
Вы не инициализировали свой диалог прогресса,
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;
}
@Override public void onPageFinished(WebView view, final String url) { progress.dismiss();
Я сделал что-то похожее, чтобы показать сообщение, когда страница начинает загружаться и закрывать ее, когда она заканчивается:
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();
}
}
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();
}
}
Я использовал в своем 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();
}
}
}