Android WebView 內處理302重定向
阿新 • • 發佈:2019-02-14
解決webView 無法載入帶有重定向的URL程式碼:
public class NewsDetailActivity extends AppCompatActivity{
private WebViewWithProgress myWebViewWithProgress;
private WebView myWebView;
private String newsDetailURL;
/**
* 記錄URL的棧
* 規則:
* 1.不可在{@code WebView.onPageFinished();}中開始記錄URL
* 2.記錄需要遮蔽重定向URL
* */
private final Stack<String> mUrls=new Stack<>();
/**
* 判斷頁面是否載入完成
* */
private boolean mIsloading=false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_news_detail);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//透明狀態列
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明導航欄
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
Toolbar toolbar = (Toolbar) findViewById(R.id.detail_toolbar);
setSupportActionBar(toolbar);
// Show the Up button in the action bar.
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
// 查詢瀏覽器控制元件ID
myWebViewWithProgress = (WebViewWithProgress) findViewById(R.id.MyWebViewContent);
//獲取瀏覽器
myWebView = myWebViewWithProgress.getWebView();
// 設定頁面支援JavaScript
myWebView.getSettings().setJavaScriptEnabled(true);
//縮放開關
//設定此屬性,僅支援雙擊縮放,不支援觸控縮放(android4.0)
myWebView.getSettings().setSupportZoom(true);
// 設定是否可縮放
myWebView.getSettings().setBuiltInZoomControls(true);
//將圖片調整到適合WebView的大小
myWebView.getSettings().setUseWideViewPort(true);
myWebView.getSettings().setDomStorageEnabled(true);
myWebView.getSettings().setUseWideViewPort(true);
myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
//設定圖片自動載入
myWebView.getSettings().setLoadsImagesAutomatically(true);
newsDetailURL = getIntent().getStringExtra("newsDetailURL");
// 設定WebView監聽事件
myWebView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// TODO Auto-generated method stub
return false;
}
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
if(mIsloading &&mUrls.size()>0)
{
mUrls.pop();
}
recordUrl(url);
super.onPageStarted(view, url, favicon);
}
@Override
public void onPageFinished(WebView view, String url) {
Log.v("FairyDebug", "URL載入完畢" + url);
super.onPageFinished(view, url);
if(mIsloading|| url.startsWith("about:"))
{
mIsloading=false;
}
}
});
Log.v("FairyDebug","--------get---------------"+newsDetailURL);
// 載入URL
myWebView.loadUrl(newsDetailURL);
}
/**
* 記錄非重定向連結 避免重新整理頁面造成的重複入棧*/
private void recordUrl(String url)
{
//這裡還可以根據自身業務來遮蔽一些連結放入URL棧
if(!TextUtils.isEmpty(url)&& !url.equalsIgnoreCase(getLastPageUrl())){
mUrls.push(url);
}
}
/**獲取上一頁的連結*/
private synchronized String getLastPageUrl(){
return mUrls.size()>0 ? mUrls.peek():null;
}
/**推出上一頁連結*/
public String popLastPageUrl(){
if(mUrls.size()>=2)
{
mUrls.pop();// pop current page url
return mUrls.pop();
}
return null;
}
}
相關知識點筆記:
若沒有設定 WebViewClient 則在點選連結之後由系統處理該 url,通常是使用瀏覽器開啟或彈出瀏覽器選擇對話方塊。
若設定 WebViewClient 且該方法返回 true ,則說明由應用的程式碼處理該 url,WebView 不處理。
若設定 WebViewClient 且該方法返回 false,則說明由 WebView 處理該 url,即用 WebView 載入該 url。