WebView 구성 및 웹 매개 변수 전달

14252 단어 개인 노트
첫 번째 블로그는 최근에 웹뷰에 관한 프로젝트를 진행하고 있습니다. 현재의 개발은 패키지의 크기를 줄이기 위해 H5와 원생 안드로이드의 혼합 개발 모델을 자주 사용하기 때문에 안드로이드 웹 페이지의 일부 특성도 연구했습니다.또한 향후 개발이 겪는 난점을 정리하고 시행착오를 피하기 위해서다.전체적인 몇 가지 문제를 나는 대략 다음과 같은 몇 가지로 나눈다. 첫째, 웹뷰의 상용 설정은 먼저 우리가 웹뷰의 설정을 생각해야 한다. 여기서 나도 더 이상 말하지 않고 코드를 직접 올리고 통용되는 웹뷰를 쓴다.
package com.fryp.frnewweb.web;

import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebSettings.RenderPriority;
import android.webkit.WebView;

import java.lang.reflect.Method;

public class SGWebView extends WebView {

    public SGWebView(Context context) {
        super(context);
        init();
    }

    public SGWebView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public SGWebView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        requestFocusFromTouch();
        setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);
        //  javascript
        this.getSettings().setJavaScriptEnabled(true);
        //          。
        this.requestFocusFromTouch();
        this.getSettings().setDefaultTextEncodingName("UTF-8");
        this.getSettings().setRenderPriority(RenderPriority.HIGH);
        this.getSettings().setAllowFileAccess(true);
        //         
        this.getSettings().setSupportZoom(false);
        this.getSettings().setLoadsImagesAutomatically(true);
//      this.getSettings().setPluginsEnabled(true);
        //       
        this.getSettings().setUseWideViewPort(true);
        //     
        this.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        this.getSettings().setLoadWithOverviewMode(true);

        //        ,        ,        ,       
        this.getSettings().setBlockNetworkImage(true);
        //      
        this.getSettings().setAppCacheEnabled(true);
        if (Integer.parseInt(Build.VERSION.SDK) < 11) {
            this.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        } else {
            this.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
        }
    }

    @SuppressWarnings("rawtypes")
    @Override
    public void destroy() {
        try {
            Class localClass = super.getClass();
            Method localMethod = localClass.getMethod("freeMemory", new Class[0]);
            localMethod.invoke(this, new Object[0]);
            super.destroy();
            return;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

위의 코드에서 WebView의 일부 통용되는 속성을 설정한 것이다. 보기 편리하도록 나는 여기에서 WebView의 설정을 찾았고 주석을 붙여서 보기 편리하게 했다. 기본적으로 어떤 속성이 필요한지 주로 자신의 수요를 보아야 한다. 상기 코드의 설정은 기본적으로 충분하다.http://www.tuicool.com/articles/zy263q http://www.th7.cn/Program/Android/201211/110963.shtml
2. WebView를 초기화하면 이전에 상속 WebView를 썼다고 생각하고 사용할 때 SGWebView를 사용합니다

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black_p50"
    android:orientation="vertical">

    <com.fryp.frnewweb.web.SGWebView
        android:id="@+id/main_webview"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
LinearLayout>

다음은 Activity나 Fragment의 주요 코드입니다. 저는 여기에 모든 코드를 먼저 붙인 다음에 따로 설명해 드리겠습니다.
 public void initViews() {
        mainWebview.setWebViewClient(new MyWebViewClient());
        mainWebview.setWebChromeClient(new MyWebChromeClient());
//        mainWebview.setWebChromeClient(new WebChromeClientUtil(getActivity(), handler));
        mainWebview.addJavascriptInterface(new JsToBrowser(getActivity(), handler), "local_obj");
        mainWebview.loadUrl("http://www.xianhua.com.cn/m/");
    }

    class MyWebChromeClient extends WebChromeClient {
        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            //                 
//            if (SimpleHUD.hud != null) {
//                SimpleHUD.hud.setProgress(newProgress);
//                SimpleHUD.hud.setDetailsLabel(newProgress + "%");
//            }
            super.onProgressChanged(view, newProgress);
        }
    }

    final class MyWebViewClient extends WebViewClient {
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Log.d("WebView", "shouldOverrideUrlLoading");
            view.loadUrl(url);
            return true;
        }

        public void onPageStarted(WebView view, String url, Bitmap favicon) {
//            SimpleHUD.showProgressLoading(getActivity(), KProgressHUD.Style.PIE_DETERMINATE);
            Log.d("WebView", "onPageStarted");
            Log.d("WebView", "url=="+url);
            nowUrl=url;
            super.onPageStarted(view, url, favicon);
        }

        public void onPageFinished(WebView view, String url) {
            Log.d("WebView", "onPageFinished ");
            //               ,“fudong” “xiazaiapp”    id
            view.loadUrl("javascript:window.local_obj.remove(document.getElementById('fudong').remove());");
            view.loadUrl("javascript:window.local_obj.remove(document.getElementById('xiazaiapp').remove());");

            //        ,   javascript           “h1”  。
            view.loadUrl("javascript:window.local_obj.remove(document.getElementsByTagName('h1')[0].innerHTML='   ');");
//            SimpleHUD.dismiss();
            super.onPageFinished(view, url);
        }
    }

    public Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1://    
                    Toast.makeText(getActivity(), "       ", Toast.LENGTH_SHORT).show();
                    break;
                default:
                    break;
            }
        }
    };

상호작용을 할 때 쓰는 종류.
package com.fryp.frnewweb.web;

import android.content.Context;
import android.os.Handler;
import android.util.Log;
import android.webkit.JavascriptInterface;


public class JsToBrowser {
    private Handler handler;
    Context mContext;

    public JsToBrowser(Context m,Handler h) {
        mContext=m;
        handler=h;
    }
    //javascript        
    @JavascriptInterface
    public void remove(String html){
        Log.d("HTML", html);
    }
}


자, 코드를 다 붙이고 사용만 하면 되는 학생에게 직접 붙이면 됩니다.다음은 코드의 내용을 분석하고 간단하게 알아보겠습니다.우선 초보적으로 배치된 것들은 설명하지 않겠습니다.직접 포인트 1,mainWebview.setWebViewClient(new MyWebViewClient()); WebView Client를 설정할 때 주로 다음과 같은 코드에서 다시 쓰는 방법을 볼 수 있다. shouldOverrideUrlLoading onPageStarted onPageFinished는 처음 웹 페이지에 들어갈 때 onPageStarted에만 들어가고 onPageFinished에 들어간 다음에 들어갈 때는 다음과 같다. shouldOverrideUrlLoading onPageStarted onPageFinished, 들어가는 방법의 순서도 마찬가지다.따라서 우리가 웹 페이지의 내용을 바꾸어야 할 때, 웹 페이지가 불러오기를 기다려야 한다. 즉, onPage Finished가 유사한view를 쓴다.loadUrl(“javascript:window.local_obj.remove(document.getElementById(‘fudong’).remove());”);를 입력합니다.그렇지 않으면 빈손가락 이상을 보고할 것이다.2、 mainWebview.addJavascriptInterface(new JsToBrowser(this, handler), “local_obj”); 웹 페이지의 상호작용을 하려면 반드시 웹 페이지가 클라이언트를 호출하는 방법이 없어서는 안 된다.local_obj는 자신이 쓴 유사한 웹 페이지에서 호출해야 하는 인터페이스입니다.remove는 이 인터페이스에 호출하는 방법과 유사합니다.물론 방법은 스스로 정의한 것이고, add (string str) 와 같은 지정한 매개 변수를 전달할 수도 있다.
총괄: 이런 내용에 관해서는 자신이 아직 깊이 이해하지 못했기 때문에 코드를 복사해서 붙이는 것만 알려줄 수 있습니다. 왜냐고 묻지 마세요.어떤 것들은 정말 이유가 없다.만약 네가 자신이 아직 풋내기라고 생각한다면, 그 문제들을 더욱 깊이 체득할 필요가 없다.'책을 백 번 읽으면 그 뜻이 저절로 보인다'는 말이 있듯이.이치는 모두 쓸 수 있다.몇 번 더 두드리면 그 뜻이 저절로 보인다.

좋은 웹페이지 즐겨찾기