2016-09-16 110 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;