2016-09-16 107 views
0

我在WebView應用程序中使用ProgressDialog。 在onPageStarted中,我顯示對話框,但在onPageFinished中使用pd.dismiss時,應用程序崩潰。應用程序在關閉ProgressDialog時崩潰

web.setWebViewClient(new WebViewClient() { 

    //Opens all the Clicked Links in App itself.. (No Opera/Browser/Chrome/Uc popup) 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     view.loadUrl(url); 
     return true; 
    } 

    //Shows a Dialog when there is an Error 
    @Override 
    public void onReceivedError(WebView view, int errorcode,String description, String fallingUrl) { 
     Toast.makeText(getActivity(),"NetWork Error", Toast.LENGTH_SHORT).show(); 
    } 

    //Showing ProgressBar when Page is Loading 
    @Override 
    public void onPageStarted(WebView view,String url , Bitmap favicon){ 
     ProgressDialog pd = new ProgressDialog(getActivity()); 
     pd.setMessage("Loading..."); 
     pd.show(); 

    } 

    //Hiding ProgressBar when Loading Finished 
    public void onPageFinished(WebView view,String Url){ 
      pd.dismiss(); 
    } 
}); 
+0

在此處添加崩潰Logcat詳細信息。 – W4R10CK

+0

你能分享你的crash stacktrace嗎?錯誤日誌 –

回答

2

它發生在nullPointerException。您需要將ProgressDialog作爲該類的實例歸檔並將其初始化爲Create。像下面這樣:

private ProgressDialog pd; 

@override 
public void onCreate() { 
    ProgressDialog pd = new ProgressDialog(getActivity()); 
    pd.setMessage("Loading..."); 
} 

現在,當你需要證明只需撥打該PD progressDialog show()方法,你可以通過調用解僱()方法隨時解聘。

1

ProgressDialog pd = new ProgressDialog(getActivity()); web.setWebViewClient(新WebViewClient(){

    //Opens all the Clicked Links in App itself.. (No Opera/Browser/Chrome/Uc popup) 
       @Override 
       public boolean shouldOverrideUrlLoading(WebView view, String url) { 
        view.loadUrl(url); 
        return true; 
       } 

       //Shows a Dialog when there is an Error 
       @Override 
       public void onReceivedError(WebView view, int errorcode,String description, String fallingUrl) { 
        Toast.makeText(getActivity(),"NetWork Error", Toast.LENGTH_SHORT).show(); 
       } 

       //Showing ProgressBar when Page is Loading 
       @Override 
       public void onPageStarted(WebView view,String url , Bitmap favicon){ 

        pd.setMessage("Loading..."); 
        pd.show(); 

       } 

       //Hiding ProgressBar when Loading Finished 
       public void onPageFinished(WebView view,String Url){ 
         pd.dismiss(); 
       } 
      }); 

它爲我

+0

它已經是。看看'onPageFinished' –

+0

你已經聲明ProgressDialog pd在外面但不能初始化。您必須在onPageStart()之外的方法外進行初始化。 –

+0

是的,我知道。你可以[編輯]你的帖子,更詳細地解釋,如果你的願望 –

0

試試這個:

//Declare it globally 
LinearLayout progressLayout; 

在OnCreate():

progressLayout = (LinearLayout) findViewById(R.id.ll_refreshing_progress); 
wv_tandc.setWebViewClient(new MyWebViewClient()); 
wv_tandc.loadUrl(getString(R.string.terms_and_conditions_url)); 

實現WebViewClient:

private class MyWebViewClient extends WebViewClient { 

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

      super.onPageStarted(view, url, favicon); 
      progressLayout.setVisibility(View.VISIBLE); 
     } 


     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 
      return true; 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      System.out.println("on finish"); 
      progressLayout.setVisibility(View.GONE); 

     } 
    } 

寫下面的代碼在你的XML,在那裏你定義了你的WebView:

<LinearLayout 
     android:id="@+id/ll_refreshing_progress" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:visibility="gone" 
     android:padding="5dp" 
     android:orientation="vertical"> 

     <ProgressBar 
      android:layout_gravity="center_horizontal" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="@string/sf_refreshing"/> 

    </LinearLayout> 

你並不需要使用progressdialog,而是可以使用自定義佈局。

0

基於此,我假設pd是一個成員變量。

//Hiding ProgressBar when Loading Finished 
public void onPageFinished(WebView view,String Url){ 
     pd.dismiss(); 
} 

但是,你似乎認爲這是分配相同的pd變量,但事實並非如此。見variable shadowing

//Showing ProgressBar when Page is Loading 
@Override 
public void onPageStarted(WebView view,String url , Bitmap favicon){ 
    ProgressDialog pd = new ProgressDialog(getActivity()); 
    pd.setMessage("Loading..."); 
    pd.show(); 

} 

ProgressDialog pd =刪除ProgressDialog,所以只是pd = new ...

0

聲明ProgressDialog對象作爲成員變量

+0

它已經是。看'onPageFinished' –

+0

在'onPageStarted()'他正在創建本地對象,它應該是成員變量。 –

+0

我知道。我在說它已經是一個成員變量,並且*它應該被初始化而不是創建本地變量。 –

0
public void onPageFinished(WebView view,String Url){ 
      if(pd ! =null)     
      pd.dismiss();  
     } 
+0

這可以避免這個問題,而不是修復它 –

0

只要改變

@Override 
       public void onPageStarted(WebView view,String url , Bitmap favicon){ 
        pd = new ProgressDialog(getActivity()); 
        pd.setMessage("Loading..."); 
        pd.show(); 

       } 

       //Hiding ProgressBar when Loading Finished 
       public void onPageFinished(WebView view,String Url){ 
         pd.dismiss(); 
       } 

,並宣佈對話框對象爲

private ProgressDialog pd;