2014-03-31 84 views
0

您好我正試圖實現一個進度條到我的webview,等待web視圖加載時彈出。我已經看到了一些做法,但我不確定哪種做法是最好的。Android在加載url時向webview添加不確定的進度條

佈局:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 

    <WebView 
     android:id="@+id/webview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 

</RelativeLayout> 

我編程方式創建進度條!

活動:

public class MapActivity extends MenuActivity { 

private final static String TAG = "HearingTest"; 
private WebView webView; 
private String urlString; 
private ProgressDialog progressDialog; 
private Context context; 

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

    urlString = getString(R.string.location_url); 

    WebViewSettings(); 

    LoadWebPage(urlString); 

    AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { 

     @Override 
     protected void onPreExecute() { 
      progressDialog = new ProgressDialog(context); 
      progressDialog.setTitle("Loading..."); 
      progressDialog.setMessage("Please wait."); 
      //progressDialog.setCancelable(false); 
      progressDialog.setIndeterminate(true); 
      progressDialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 
      try { 
       //Do something... 
       Thread.sleep(5000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      if (progressDialog!=null) { 
       progressDialog.dismiss(); 
      } 
     } 
    }; 

    task.execute((Void[])null); 
} 

public void LoadWebPage(String url){ 

    try { 
     webView.loadUrl(url); 
     Log.d(TAG, "URL" + url + "connected"); 
    } 
    catch (Exception e) { 
      Log.d(TAG, "URL: " + url + " couldn't connect."); 
    } 
} 

public void WebViewSettings(){ 

    webView = (WebView) findViewById(R.id.webview); 
    webView.getSettings().setJavaScriptEnabled(true); 
    webView.getSettings().setBuiltInZoomControls(true); 
    webView.getSettings().setSupportZoom(true); 
    webView.getSettings().setLoadWithOverviewMode(true); 

    webView.setWebViewClient(new WebViewClient(){ 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      if (Uri.parse(url).getHost().equals(urlString)) { 
       // This is my web site, so do not override; let my WebView load the page 
       return false; 
      } 
      // Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs 
      Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
      startActivity(intent); 
      return true; 
     } 

     @Override 
     public void onReceivedSslError (WebView view, SslErrorHandler handler, SslError error) { 
      handler.proceed(); 
     } 
    }); 
} 

    protected void DisplayProgressBar(){ 

    } 
} 

我有問題是,我真的不知道什麼是最好的方式去這樣做是。我現在這樣做的方式,當我創建一個進度條的新實例時,我得到一個空指針異常,我找不到原因!另外,我不知道我是否以最好的方式做到這一點,因爲我已經看到了另一種使用線程的方式。

如果有人可以幫助我解決我的問題或告訴是一個更好的解決方案,將不勝感激。

回答

1

context爲null,並且這可能就是你在onCreate

+0

輝煌感謝您的幫助獲得NullPointerException

初始化contextcontext = MapActivity.this;,新那將是很簡單的東西。 – Paddy1990

+0

另一件事是我真的不知道'protected void void addInBackground(Void ... arg0)'是用來做什麼的,因爲它沒有做任何事情,爲什麼這個方法需要? – Paddy1990

+0

'doInBackground'是一個在後臺執行的異步任務。它用於執行可能需要很長時間才能完成的(背景)操作(例如:從服務器請求數據)。你可以在這裏閱讀更多的AsyncTask http://developer.android.com/reference/android/os/AsyncTask.html – JoelFernandes