1. 程式人生 > >ScrollView 巢狀webview 高度失調 等項關設定,點選攔截

ScrollView 巢狀webview 高度失調 等項關設定,點選攔截

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/white"
    android:orientation="vertical"
    tools:context="${relativePackage}.${activityClass}" >

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:background="@color/blue"
        android:fillViewport="true"
        android:scrollbars="none" >
<!-- android:fillViewport="true"  這裡是防止webview的底部空 白 -->
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@color/white"
            android:orientation="vertical" >

            <include
                android:id="@+id/maildetail_head_rl"
                layout="@layout/head_arrow_title" />

            <LinearLayout style="@style/line_fill_horizontal" />

            <include
                android:id="@+id/maildetail_head_digestll"
                layout="@layout/maildetail_head_digest" />
            <!-- 這是附件的內容 -->

            <LinearLayout style="@style/line_fill_horizontal" />

   		  <com.jiangmen.zdaiapp.view.MerchantWebView
                android:id="@+id/maildetail_content"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:scrollbars="none" />  
		 <!--  (因為scrollView的ViewPort屬性設定導致的)
                                  這裡寬高是 
                                   match:webview滑動,ScrollView部滑動;
				   wrap: webview部滑動,ScrollView滑動。   -->
            
        </LinearLayout>
    </ScrollView>

    <LinearLayout
        style="@style/line_fill_horizontal"
        android:layout_gravity="bottom" />

    <include
        android:id="@+id/detail_bottomenu"
        layout="@layout/maildetail_bottom_menu" />

</LinearLayout>


自定義webView
package com.jiangmen.zdaiapp.view;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.http.SslError;
import android.os.Handler;
import android.util.AttributeSet;
import android.util.Log;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.webkit.JavascriptInterface;
import android.webkit.JsResult;
import android.webkit.SslErrorHandler;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebSettings.LayoutAlgorithm;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.Toast;

/**
 * ******************************************
 * 
 * File name:MerchantWebView.java
 * 
 * @Author zhsf @Date:2015-11-30
 * 
 * @Description: com.jiangmen.zdaiapp.view.MerchantWebView
 * 
 *               ******************************************
 */
public class MerchantWebView extends WebView {

	private OnWebViewListener onWebViewListener;
	private Context mwContext;
	
//	/**自定義選單的  按鈕*/
//	private final int WEB_FenXiang=11;
//	private final int WEB_XiaZai=12;
//	private final int WEB_FuZhi=13;
//	private final int WEB_AddSQ=14;
	
	public interface OnWebViewListener {
		public void WebViewOnProgressChanged(WebView view, int newProgress);
	}

	public void setOnWebViewListener(OnWebViewListener onWebViewListener) {
		this.onWebViewListener = onWebViewListener;
	}

	public MerchantWebView(Context context) {
		super(context);
		init();
		mwContext=context;
	}

	public MerchantWebView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		init();
		mwContext=context;
	}

	public MerchantWebView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mwContext=context;
		init();
	}

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

	private void init() {
		WebSettings setting = getSettings();
		setting.setJavaScriptEnabled(true); // 0
		setting.setJavaScriptCanOpenWindowsAutomatically(true);// 允許js彈出視窗
		setting.setBuiltInZoomControls(false); // 原網頁基礎上縮放 //0
		setting.setUseWideViewPort(true); // 0
		setting.setSupportZoom(false);// 支援縮放 //0
		setting.setLoadWithOverviewMode(true);
		setting.setDomStorageEnabled(true); // 資料庫儲存API是否可用,預設值false

		setting.setTextZoom(250);
//		setting.setLoadsImagesAutomatically(true);// 設定這兩項可以上下面兩個方法載入有效
		
		setting.setBlockNetworkImage(false); // 是否禁止從網路獲取資源,通過http、https URI
		setting.setBlockNetworkLoads(false);//Block  : 攔截阻塞
		setting.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);// 支援內容重新佈局
		setting.setDisplayZoomControls(false);// 不顯示webview縮放按鈕1
		setPageCacheCapacity(setting);
		setWebViewClient(this);
		setScrollContainer(false);//禁止內容滑動X-Y;注意看xml的設定

		addJavascriptInterface(this, "Resize");
	}

	private void setWebViewClient(WebView webView) {
		webView.setWebViewClient(new WebViewClient() {

			@Override
			public void onPageStarted(WebView view, String url, Bitmap favicon) {
				Toast.makeText(mwContext, "onPageStarted="+url, Toast.LENGTH_SHORT).show();
				Log.e("onPageStarted", "onPageStarted=="+url);

				
				super.onPageStarted(view, url, favicon);
			}

			@Override
			public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event) {
				
				return super.shouldOverrideKeyEvent(view, event);
			}

			/* 
			 * 這個方法是,載入url( 你選中的URL )//這裡我  開啟新的頁面進行預覽
			 * */
			@Override
			public boolean shouldOverrideUrlLoading(WebView view, String url) {
				// computeHeight();//這個方法,屁股後面總是多出好多空白
//				view.loadUrl(url);/這裡我  開啟新的頁面進行預覽
				Toast.makeText(mwContext, "shouldOverrideUrlLoading="+url, Toast.LENGTH_SHORT).show();
				Log.e("shouldOverrideUrlLoading", "shouldOverrideUrlLoading=="+url);
				
////				這個方法 沒有設定邊距; 所以,當有  格式錯誤的郵件內容顯示不完全
//			    int w = View.MeasureSpec.makeMeasureSpec(0,  
//                        View.MeasureSpec.UNSPECIFIED);  
//                int h = View.MeasureSpec.makeMeasureSpec(0,  
//                        View.MeasureSpec.UNSPECIFIED);  
//                //重新測量  
//                measure(w, h);
                
				return true;
			}

			@Override
			public void onPageFinished(WebView view, String url) {
//				 computeHeight();//這個方法,屁股後面總是多出好多空白
				// String text = "我是來自Android";
				// view.loadUrl("javascript:carDetail('" + text + "');");
				
////				這個方法 沒有設定邊距;所以,當有  格式錯誤的郵件內容顯示不完全
//			    int w = View.MeasureSpec.makeMeasureSpec(0,  
//                        View.MeasureSpec.UNSPECIFIED);  
//                int h = View.MeasureSpec.makeMeasureSpec(0,  
//                        View.MeasureSpec.UNSPECIFIED);  
//                //重新測量  
//                measure(w, h);  
				
                view.loadUrl("javascript:document.body.style.padding=\"4%\"; void 0");//設定Padding
//				Log.e("onPageFinished", "onPageFinished=="+url);
                super.onPageFinished(view, url);

			}

			@Override
			public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
				handler.proceed(); // 接受所有網站的證書
			}
			@Override
			public void onLoadResource(WebView view, String url) {
				// TODO Auto-generated method stub
				super.onLoadResource(view, url);
			}
		});
		
		
		webView.setWebChromeClient(new WebChromeClient() {
			@Override
			public void onProgressChanged(WebView view, int newProgress) {
				super.onProgressChanged(view, newProgress);
				if (null != onWebViewListener) {
					onWebViewListener.WebViewOnProgressChanged(view, newProgress);
				}
			}

			@Override
			public void onReceivedTitle(WebView view, String title) {
//				Log.e("onReceivedTitle", "onReceivedTitle=="+title);
				super.onReceivedTitle(view, title);
			}
			
			@Override
			public boolean onJsAlert(WebView view, String url, String message, JsResult result) {

//				Log.e("onJsAlert", "onJsAlert=="+url+"message=="+message);
				return super.onJsAlert(view, url, message, result);
			}
			

		});
		
//	自定義 長按選單欄
//		webView.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener(){
//
//			public void onCreateContextMenu(ContextMenu menu, View arg1,
//			ContextMenuInfo arg2) {
//			// TODO Auto-generated method stub
//			MenuItem.OnMenuItemClickListener handler = new MenuItem.OnMenuItemClickListener() {
//					@Override
//					public boolean onMenuItemClick(MenuItem item) {
//						// do the menu action
//						switch (item.getItemId()) {
//							case WEB_FenXiang:
//								Log.i("you click","分享");
//							break;
//							case WEB_XiaZai:
//							Log.i("you click","下載");
//							break;
//							case WEB_FuZhi:
//							Log.i("you click","複製");
//							break;
//							case WEB_AddSQ:
//							Log.i("you click","增加到書籤");
//							break;
//						}
//					return true;
//			}};
//			
//			Log.i("long click","true");
//			HitTestResult result = ((WebView) arg1).getHitTestResult();
//			int resultType = result.getType();
//			if ((resultType == HitTestResult.ANCHOR_TYPE) ||
//			(resultType == HitTestResult.IMAGE_ANCHOR_TYPE) ||
//			(resultType == HitTestResult.SRC_ANCHOR_TYPE) ||
//			(resultType == HitTestResult.SRC_IMAGE_ANCHOR_TYPE)) {
//			Intent i = new Intent();
//			Log.i("extrea",result.getExtra());
//			
//			MenuItem item = menu.add(0, WEB_FenXiang, 0, "分享").setOnMenuItemClickListener(handler);
//			item.setIntent(i);
//			item = menu.add(0, WEB_FuZhi, 0, "複製").setOnMenuItemClickListener(handler); 
//			item.setIntent(i);
//
//			item = menu.add(0,WEB_XiaZai, 0,"下載").setOnMenuItemClickListener(handler); ; 
//			item.setIntent(i);
//
//			item = menu.add(0,WEB_AddSQ, 0,"增加到書籤").setOnMenuItemClickListener(handler); ; 
//			item.setIntent(i);
//			menu.setHeaderTitle(result.getExtra()); 
//			}
//			else if (resultType == HitTestResult.IMAGE_TYPE) {
//			Log.i("image type","ture");
//			Intent i = new Intent();
//			MenuItem item = menu.add(0, 1, 0, "OPEN"); 
//			item.setIntent(i);
//			item = menu.add(0, 2, 0, "圖片"); 
//			item.setIntent(i); 
//			menu.setHeaderTitle(result.getExtra());
//			}
//			}
//			});
//		webView.setOnCreateContextMenuListener(new View.OnCreateContextMenuListener() {  
//			  
//            public void onCreateContextMenu(ContextMenu menu, View arg1,  
//                    ContextMenuInfo arg2) {  
//                // TODO Auto-generated method stub  
//                MenuItem.OnMenuItemClickListener handler = new MenuItem.OnMenuItemClickListener() {  
//                    public boolean onMenuItemClick(MenuItem item) {  
//                        // do the menu action  
//                        switch (item.getItemId()) {  
//                        case 1:  
//                            Log.i("you click", "分享");  
//                            break;  
//                        case 2:  
//                            Log.i("you click", "下載");  
//                            break;  
//                        }  
//                        return true;  
//                    }  
//                };  
//  
//                HitTestResult result = ((WebView) arg1).getHitTestResult();  
//                int resultType = result.getType();  
//                if ((resultType == HitTestResult.IMAGE_TYPE)) {  
//                    menu.setHeaderTitle(result.getExtra());  
//  
//                    Intent i = new Intent();  
//                    MenuItem item = menu.add(0, 1, 0, "分享")  
//                            .setOnMenuItemClickListener(handler);  
//                    item.setIntent(i);  
//  
//                    item = menu.add(0, 2, 0, "下載").setOnMenuItemClickListener(  
//                            handler);  
//                    item.setIntent(i);  
//                }  
//            }  
//        });  
	}

	private Handler handler = new Handler();
	private Runnable runnable;

	/**
	 * 這個方法,屁股後面總是多出好多空白;不行
	 */
	private void computeHeight() {
		loadUrl("javascript:Resize.fetchHeight(document.body.getBoundingClientRect().height)");
	}

	@JavascriptInterface
	public void fetchHeight(final float height) {
		final int newHeight = (int) (height * getResources().getDisplayMetrics().density);
		runnable = new Runnable() {
			@Override
			public void run() {
				if (getLayoutParams() instanceof LinearLayout.LayoutParams) {
					LinearLayout.LayoutParams linearParams = (LinearLayout.LayoutParams) getLayoutParams();
					linearParams.height = newHeight;
					
					setLayoutParams(linearParams);
				}
			}
		};
		if (null != handler) {
			handler.postDelayed(runnable, 50);
		}
	}

	/**
	 * 當進行goBack的時候 使用前一個頁面的快取 避免每次都重新載入
	 * 
	 * @param webSettings
	 *            webView的settings
	 */
	protected void setPageCacheCapacity(WebSettings webSettings) {
		try {
			Class<?> c = Class.forName("android.webkit.WebSettingsClassic");
			if (null != c) {
				Method tt = c.getMethod("setPageCacheCapacity", new Class[] { int.class });
				if (null != tt) {
					tt.invoke(webSettings, 5);
				}
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			e.printStackTrace();
		}
	}

}


呼叫:
@SuppressLint({ "SetJavaScriptEnabled", "NewApi" })
	private void initWebView(MerchantWebView webView, String... newContent) {
		// WebSettings webSettings=webView.getSettings();
		//
		// webView.setInitialScale(39); //適應全屏: 39適應豎屏 57適應橫屏;0預設的,不做任何修改 ;
		//
		// webSettings.setJavaScriptEnabled(true);//支援JS,不然下面的不起作用0
		// webSettings.setSupportZoom(true);//支援螢幕縮放0
		// webSettings.setBuiltInZoomControls(true);//設定WebView可觸控放大縮小0
		// webSettings.setDisplayZoomControls(false);//不顯示webview縮放按鈕
		// webSettings.setUseWideViewPort(true);
		// //設定雙擊變大,再雙擊變小,當手動放大後,雙擊可以恢復到原始大小,設定如下
		// webSettings.setTextZoom(200);//字型大小 WebSettings wb;
		//
		// String htmlText = "<html>" + "<head>" + "<style type=\"text/css\">" +
		// "body{padding-left: 40px;padding-right: 40px;}" + "</style>" +
		// "</head>";

		webView.loadDataWithBaseURL("",
				// getHtmlData(msgEmail.getBodyContent().replaceAll(" ",
				// " ").replaceAll("\n", "<br/>")),
				// "<span >"+ //顯示文字內容 style=\"color:#333; font-size:10px;
				// color:#F60\"
				newContent[0]
				// .replaceAll(" ", " ").replaceAll("\n", "<br/>")+
				// "</span>" //  4個==一個漢字位 一個空格
				, "text/html", "UTF-8", "");
	}


清單檔案設定:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.jiangmen.zdaiapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="22" />
    
<!--選擇性新增到清單檔案中,可填寫可不填寫 <supports-screens 
        android:smallScreens="true"
        android:normalScreens="true"
        android:largeScreens="true"
        android:xlargeScreens="true"
        android:anyDensity="true"/> -->