2017-02-14 51 views
1

我有問題。 我在main2activity中做一個progressbar。 應用程序啓動,但其網站載入進度欄時不會消失。 而我的應用程序崩潰。 請幫忙! :* 我想更正我的代碼,因爲這是瞭解錯誤發生的最佳方法。 謝謝!在Webview中加載ProgresBar

有代碼:

package musial.pzstis.com.pzstiz; 

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.View; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.ProgressBar; 

/* 
* Demo of creating an application to open any URL inside the application and clicking on any link from that URl 
should not open Native browser but that URL should open in the same screen. 

- Load WebView with progress bar 
*/ 
public class Main2Activity extends Activity { 
    /** Called when the activity is first created. */ 

    WebView myWebView; 
    ProgressBar progressBar; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main2); 

     myWebView = (WebView) findViewById(R.id.webView); 
     progressBar = (ProgressBar) findViewById(R.id.progressBar7); 

     myWebView.setWebViewClient(new myWebClient()); 
     myWebView.getSettings().setJavaScriptEnabled(true); 
     WebSettings webSettings = myWebView.getSettings(); 
     myWebView.loadUrl("https://docs.google.com/viewer?url=http%3A%2F%2Fpzstiz.swiebodzin.pl%2Fzastepstwa%2FPZSTiZ_zastepstwa.pdf"); 
     webSettings.setBuiltInZoomControls(true); 
     webSettings.setSupportZoom(true); 
     myWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 
     myWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); 

    } 

    public class myWebClient extends WebViewClient 
    { 
     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      // TODO Auto-generated method stub 
      super.onPageStarted(view, url, favicon); 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      // TODO Auto-generated method stub 
      progressBar.setVisibility(View.VISIBLE); 
      view.loadUrl(url); 
      return true; 

     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      // TODO Auto-generated method stub 
      super.onPageFinished(view, url); 

      progressBar.setVisibility(View.GONE); 
     } 
    } 

    // To handle "Back" key press event for WebView to go back to previous screen. 
    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
     if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) { 
      myWebView.goBack(); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 
} 

有日誌:

02-14 20:43:38.592 20262-20299/musial.pzstis.com.pzstiz E/EGL_emulation: tid 20299: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH) 
02-14 20:43:44.672 20262-20262/musial.pzstis.com.pzstiz E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: musial.pzstis.com.pzstiz, PID: 20262 
                      java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ProgressBar.setVisibility(int)' on a null object reference 
                       at musial.pzstis.com.pzstiz.Main2Activity$myWebClient.onPageFinished(Main2Activity.java:66) 
                       at com.android.webview.chromium.WebViewContentsClientAdapter.onPageFinished(WebViewContentsClientAdapter.java:531) 
                       at org.chromium.android_webview.AwContentsClientCallbackHelper$MyHandler.handleMessage(AwContentsClientCallbackHelper.java:188) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:154) 
                       at android.app.ActivityThread.main(ActivityThread.java:6119) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 
02-14 20:43:44.777 1569-4538/system_process E/EGL_emulation: tid 4538: eglSurfaceAttrib(1174): error 0x3009 (EGL_BAD_MATCH) 

回答

0

那麼,你得到了與進度的空指針異常,我將封裝每次訪問這種形式的進度:

if(progressBar == null) 
    progressBar = (ProgressBar) findViewById(R.id.progressBar7); 
if(progressBar) 
    progressBar.setVisibility(View.GONE); 

實現在vour代碼:

public class Main2Activity extends Activity { 
/** Called when the activity is first created. */ 

WebView myWebView; 
ProgressBar progressBar; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main2); 

    myWebView = (WebView) findViewById(R.id.webView); 
    progressBar = (ProgressBar) findViewById(R.id.progressBar7); 

    myWebView.setWebViewClient(new myWebClient(this)); 
    myWebView.getSettings().setJavaScriptEnabled(true); 
    WebSettings webSettings = myWebView.getSettings(); 
    myWebView.loadUrl("https://docs.google.com/viewer?url=http%3A%2F%2Fpzstiz.swiebodzin.pl%2Fzastepstwa%2FPZSTiZ_zastepstwa.pdf"); 
    webSettings.setBuiltInZoomControls(true); 
    webSettings.setSupportZoom(true); 
    myWebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE); 
    myWebView.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH); 

} 

public class myWebClient extends WebViewClient 
{ 

    privat Activity main2ac; 
    ProgressBar progressBar; 

    public myWebClient(Activity handle){ 
     main2ac = handle; 
    } 

    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     // TODO Auto-generated method stub 
     super.onPageStarted(view, url, favicon); 
    } 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    // TODO Auto-generated method stub 

     if(progressBar == null) 
      progressBar = (ProgressBar)main2ac.findViewById(R.id.progressBar7); 
     if(progressBar) 
      progressBar.setVisibility(View.VISIBLE); 
     view.loadUrl(url); 
     return true; 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     // TODO Auto-generated method stub 
     super.onPageFinished(view, url); 

     if(progressBar == null) 
      progressBar = (ProgressBar)main2ac.findViewById(R.id.progressBar7); 
     if(progressBar) 
      progressBar.setVisibility(View.GONE); 
    } 
} 
+0

我不明白。嗯,你可以在代碼中添加這個/編輯? –

+0

java.lang.NullPointerException:試圖在空對象引用 –

1

通行證進度您的自定義網頁視圖:

myWebView.setWebViewClient(new myWebClient(progressBar)); 

更改myWebClient類這樣的:

public class myWebClient extends WebViewClient { 
    private ProgressBar progressBar; 

    public myWebClient(ProgressBar progressBar) { 
     this.progressBar=progressBar; 
     progressBar.setVisibility(View.VISIBLE); 
    } 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     // TODO Auto-generated method stub 
     view.loadUrl(url); 
     return true; 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     // TODO Auto-generated method stub 
     super.onPageFinished(view, url); 
     progressBar.setVisibility(View.GONE); 
    } 
} 

希望這有助於。

+0

上調用虛擬方法'void android.widget.ProgressBar.setVisibility(int)'有錯誤 - > http://imgur.com/a/PhReN –

+0

傳遞myWebView.setWebViewClient中的進度條(new myWebClient(progressBar)); – tahsinRupam

+0

現在當我點擊按鈕到這個活動的應用程序停止。有來自監視器的代碼。 http://pastebin.com/sfbkdyaf –