2011-03-14 63 views
5

我想一個一個地加載URL。我使用String數組來存儲URL。我的要求是,如果webview加載第一個url,它應該打印msg的「啓動頁面」時頁面開始,當頁面完成時它應該顯示「頁面已完成」。第一次加載完成後,它應該加載第二個URL並繼續執行相同的過程。如何逐個加載URL

我寫的代碼如下:

package com.browser; 
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.util.Log; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class browser extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final String[] url={"http://www.yahoo.com","http://www.google.com","http://www.ibnlive.com"}; 
     final MyWebView mwv = new MyWebView(this); 
     mwv.setWebViewClient(new myweb()); 
     new Thread(new Runnable(){ 
      public void run(){ 
       Log.d("runThread","runthread"); 
       for(int i=0;i<2;i++){ 
        openbrowser(url[i]); 
       } 

      } 

      private void openbrowser(String url) { 

       mwv.getSettings().setJavaScriptEnabled(true); 
       mwv.loadUrl(url); 
       Log.d("",""+url); 
       setContentView(mwv); 
      } 
     }).start(); 
    } 


    public class MyWebView extends WebView{ 

     public MyWebView(Context context) { 
      super(context); 

     } 
    } 
    public class myweb extends WebViewClient{ 
     @Override  
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      System.out.println("LOADING"); 

      return false; 
     } 
     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 

      System.out.println("PageStarted: " + url); 
     } 

     @Override 
     public void onPageFinished(WebView view, String url){ 
      System.out.println("PageFinished: " + url); 
     } 
    } 


    } 
    ///indented code <--remove this 

它加載只有最後一個URL。

回答

2

問題是,你不等待onPageStarted()和onPageFinished返回任何東西。相反,你的代碼只是一個接一個地加載url,以至於你只能看到最後一個。

您需要修改for()循環以在加載另一個頁面之前等待onPagefinished()方法返回。

3

我試圖模仿與以下想出了:

package com.mywebslider; 


import android.app.Activity; 
import android.os.Bundle; 
import android.os.CountDownTimer; 
import android.view.KeyEvent; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.TextView; 
import android.widget.Toast; 

public class WebSliderActivity extends Activity { 

    TextView number; 
    WebView mWebView; 
    CountDownTimer mTimer; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 


     number = (TextView) findViewById(R.id.number); 
     mTimer=new CountDownTimer(15000, 1000) { 

     String[] myArray={"http://www.upc.nl/","http://www.google.com","http://www.quickspot.nl"}; 


      int currentIndex=0; 
      public void onTick(long millisUntilFinished) { 

       number.setText("seconds remaining: " + millisUntilFinished/1000); 
      } 
      //code comment start 
      // i think this part could be written better 
      // but it works!!! 
      public void onFinish() { 
       if (currentIndex<myArray.length) { 
        number.setText("done!"); 
        mWebView.loadUrl(myArray[currentIndex]); 
        currentIndex++; 
       } else { 
        currentIndex=0; 
        if (currentIndex<myArray.length) 
        number.setText("done!"); 
        mWebView.loadUrl(myArray[currentIndex]); 
        currentIndex++; 
        mTimer.start(); 
       } 

        mTimer.start(); 

      } 
      //code comment end 
     }; 

     mTimer.start(); 
     mWebView = (WebView) findViewById(R.id.webview); 
     mWebView.getSettings().setJavaScriptEnabled(true); 
     mWebView.loadUrl("http://stackoverflow.com"); 
     mWebView.setWebViewClient(new WebSliderWebViewClient(){ 
     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(mWebView, url); 
      Toast.makeText(getApplicationContext(), "Done!", Toast.LENGTH_SHORT).show(); 

     } 

     @Override 
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
      Toast.makeText(getApplicationContext(), "Oh no! " + description, Toast.LENGTH_SHORT).show(); 

     } 
    }); 


    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { 
      mWebView.goBack(); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 

    private class WebSliderWebViewClient extends WebViewClient { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      view.loadUrl(url); 
      return true; 
     } 
    } 
} 

旁其實這個作品中,陣列循環可以做的更好。 main.xml中應改爲:

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

    <WebView 
    android:id="@+id/webview" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    /> 

<TextView 
    android:id="@+id/number" 
    android:layout_width="fill_parent" 
    android:layout_height="0dp" 
    android:layout_weight="1" 
    /> 

</LinearLayout> 

輸出將使50/50屏幕。 一個用於WebView,另一半用於顯示TextView中的計數器。

+0

@Agarwal Shankar我試過你的代碼,但第一次運行時,我得到一個強制關閉。我錯過任何東西在main.xml文件?我不熟悉你提出的代碼類型。 – HenryW 2012-05-29 18:12:16

5

您可以使用下面的代碼在web視圖中逐個加載url。這段代碼只是一個接一個地加載你只能看到或不能看到所有url的url,但你可以看到最後一個。

public class WebViewsScreenActivity extends Activity { 

    private WebView mwebview; 
    int i =0; 
    private WebViewsScreenActivity _activity; 
    ProgressDialog _dilog; 
    private String[] Urls = {"http://www.google.com","http://www.gmail.com","http://www.yahoo.com"}; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getWindow().requestFeature(Window.FEATURE_PROGRESS); 
     mwebview = new WebView(this); 
     setContentView(mwebview); 
     _activity = this; 
     mwebview.getSettings().setJavaScriptEnabled(true); 
     mwebview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 

     if(checkInternetConnection(_activity)){ 
      if(savedInstanceState==null)  
       mwebview.loadUrl(Urls[i]); 
      else 
       mwebview.restoreState(savedInstanceState); 
     } 
     else{ 
      //showAlert "Unable to Connect Server" 
     } 
     mwebview.setWebChromeClient(new WebChromeClient() { 

       @Override 
     public void onProgressChanged(WebView view, int progress) { 
       if(mwebview.getVisibility()==View.VISIBLE) 
       { 
       WebViewsScreenActivity.this.setProgress(progress * 100); 

       } 
       } 
       }); 
     mwebview.setWebViewClient(new HelloWebViewClient()); 
    } 

    @Override 
    public boolean onKeyUp(int keyCode, KeyEvent event) { 
     // TODO Auto-generated method stub 
     if(keyCode == KeyEvent.KEYCODE_BACK) 
     { 
      mwebview.goBack(); 
      return true; 
     } 
     else 
      return super.onKeyUp(keyCode, event); 
    } 


    //To check whether network connection is available on device or not 
    private boolean checkInternetConnection(Activity _activity) { 
     ConnectivityManager conMgr = (ConnectivityManager) _activity.getSystemService(Context.CONNECTIVITY_SERVICE); 
     if (conMgr.getActiveNetworkInfo() != null 
       && conMgr.getActiveNetworkInfo().isAvailable() 
       && conMgr.getActiveNetworkInfo().isConnected()) 
      return true; 
     else 
      return false; 
    }//checkInternetConnection() 



    //HelloWebViewClient class for webview 
    private class HelloWebViewClient extends WebViewClient { 

     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      // TODO Auto-generated method stub 
      super.onPageStarted(view, url, favicon); 
        Toast.makeText(getApplicationContext(), "Loading started...!"+Urls[i], Toast.LENGTH_SHORT).show(); 

     } 
     @Override 
     public void onReceivedError(WebView view, int errorCode, 
       String description, String failingUrl) { 
      // TODO Auto-generated method stub 
      super.onReceivedError(view, errorCode, description, failingUrl); 

     } 
     @Override 
     public void onPageFinished(WebView view, String url) { 
      // TODO Auto-generated method stub 
      super.onPageFinished(view, url); 
        Toast.makeText(getApplicationContext(), "Loading done...!"+Urls[i], Toast.LENGTH_SHORT).show(); 
      i++; 
      if(i<Urls.length) 
       view.loadUrl(Urls[i]); 
     } 
    } //HelloWebViewClient-class 
}//AccountsScreenActivity-class 

添加在manifeast文件的權限如下::

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.vl.agarwal" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="8" /> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".WebViewsScreenActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 
+0

您需要在清單文件 – 2012-05-30 02:34:30

8

試試這個...

int position=0; 

textview.setText("page started"); 
browser.loadUrl("your first url"); 
browser.setWebChromeClient(new WebChromeClient() 
{ 
    public void onProgressChanged(WebView view, int progress) 
    { 
     if(progress == 100) 
     { 
      textview.setText("page finished"); 
      if(position==0) 
      { 
      browser.loadUrl("your second url"); 
      position=1; 
      textview.setText("page started"); 
      } 
      if(position==1) 
      { 
      browser.loadUrl("your third url"); 
      position=2; 
      textview.setText("page started"); 
      } 
     } 
    } 
}); 

還可以顯示吐司相反的TextView的..

+0

+1中添加權限,以獲得清晰且正確的解決方案 – 2012-06-01 17:57:42

+0

@SamirMangroliya hmm感謝兄弟... – 2012-06-02 04:02:38

2

嘗試編碼WebViewClient擴展以在加載完成時通知您的活動。我試圖修改你的代碼來做到這一點:

package com.browser; 
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.os.Bundle; 
import android.util.Log; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class Browser extends Activity { 

private MyWebView mwv = null; 
private MyWeb myweb = null; 
private List<String> urls = null; 
private String[] url = new String[] {"http://www.yahoo.com","http://www.google.com","http://www.ibnlive.com"}; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mwv = new MyWebView(this); 
    myweb = new MyWeb(this); 
    mwv.setWebViewClient(myweb); 
    urls = Arrays.asList(url); 
    loadNextUrl(null); 
} 

private loadNextUrl(String fromUrl) { 
    if (fromUrl == null) { 
     myweb.setOriginalUrl(urls.get(0)); 
     mwv.loadUrl(urls.get(0)); 
    } else { 
     if (urls.indexOf(fromUrl) == urls.size() - 1) return; 
     String newUrl = urls.get(urls.indexOf(fromUrl) + 1); 
     myweb.setOriginalUrl(newUrl); 
     mwv.loadUrl(newUrl); 
    } 
} 


public class MyWebView extends WebView{ 

    public MyWebView(Context context) { 
     super(context); 

    } 
} 
public class MyWeb extends WebViewClient{ 
    Browser activity = null; 

    // Prevent redirects from messing with URL array 
    String originalUrl = null; 

    public MyWeb(Browser activity) { 
     this.activity = activity; 
    } 

    public setOriginalUrl(String url) { 
     this.originalUrl = url; 
    } 

    @Override  
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     System.out.println("LOADING"); 

     return false; 
    } 
    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 

     System.out.println("PageStarted: " + url); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url){ 
     System.out.println("PageFinished: " + url); 
     activity.loadNextUrl(originalUrl); 
    } 
} 


} 
1

你可以使用一個隊列來保存一個接一個地加載的url。

Queue<String> mQueue = new LinkedList<String>(); 
... 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    mQueue.add("http://url1"); 
    mQueue.add("http://url2"); 
    mQueue.add("http://urln"); 
    ... 
    String url = mQueue.remove(); 
    mwv.loadurl(url); 
} 
... 
public class myweb extends WebViewClient{ 
    @Override  
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     System.out.println("LOADING"); 

     return false; 
    } 
    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     System.out.println("PageStarted: " + url); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url){ 
     System.out.println("PageFinished: " + url); 
     String url = null; 
     url = mQueue.remove(); 
     if (url != null) { 
      view.loadUrl(url); 
     } 
    } 
}