WebView(Webページビュー)の基本的な使い方


このセクションの概要

このセクションでは、Web ページを表示するための Android のコントロール: WebView (Web ページ ビュー) を紹介します。

今すぐAndroidアプリ レイヤー開発には 2 つの方向があります。クライアント開発と HTML5 モバイル開発です。

いわゆる HTML5 の終わりは次のとおりです: HTML5 + CSS + JS を構築する アプリケーションの Web バージョンであり、中間媒体は WebView であり、Web と Web ページは JS を通じて対話できます。たとえば、次のようになります。 Web ページは携帯電話の連絡先を読み取り、携帯電話関連の API などを呼び出します。

そして、通常のクライアント開発と比較して、HTML5 モバイル端末には次のような利点があります。 レイアウトにパーセンテージを使用でき、HTML5 側に大きな変更があった場合でも、クライアントのように APP を再作成する必要はありません。 インストールを上書きするには、Web ページを変更するだけです。そしてクライアントは...もちろん、HTML5 にもパフォーマンスの問題という欠点があります。 データの蓄積、電力消費の問題、画面のちらつきなど...

さらに、この種のクロスプラットフォームでは、他のサードパーティを使用して迅速に開発することができます PhoneGap などのフレームワーク、はい、インターネット上には、ユーザーがドラッグ アンド ドロップして画像を設定できるワンクリック APP のような Web サイトもたくさんあります。 このような単純な操作でアプリケーションを生成できますが、そのほとんどは HTML5 を使用して実行されます。テンプレートがあるので、それを適用するだけです〜 さて、さっそくこのセクションを始めましょう!

1. WebView とは何ですか?

回答: Android には Webkit カーネルが組み込まれた高性能ブラウザがあり、WebView はこれに基づいてカプセル化されています。 コントロール、WebView Web ビューの直訳。単純に、インターフェイス上にネストできるブラウザ コントロールとみなすことができます。

2. 関連メソッド

まず公式ドキュメントにアクセスしてください: WebView プロパティについて一つ一つ説明し、どのプロパティが使用されているかを書き、その他の情報については自分でドキュメントを確認するつもりはありません。 直接 WebView に加えて、独自の動作を追加することもでき、次のクラスをカスタマイズできます:


WebChromeClient: WebView が Javascript ダイアログ ボックス、Web サイトのアイコン、Web サイトのタイトル、読み込みの進行状況などを処理するのを支援します。 例:

メソッド関数
onJsAlert(WebView view,String url,String message,JsResult result)Jsでのアラートダイアログボックスの処理
s確認(WebViewビュー、 String url,String message,JsResult result)Js で確認ダイアログ ボックスを処理する
onJsPrompt(WebView view,String url,String message,String defaultValue,JsPromptResult result)Js でプロンプト ダイアログ ボックスを処理する
onProgressChanged(WebView view, int newProgress)読み込み進行状況バーが変化すると呼び出されます
onReceivedIcon(WebView view, Bitmap icon)Webページのアイコンを取得します
onReceivedTitle (WebView view, String title) Web ページのタイトルを取得します

WebViewClient: WebView がさまざまな通知やリクエスト イベントを処理できるように支援します。 たとえば、次のメソッド:

(WebView view, String url ) WebView が指定された URL のリソースをロードしようとしていることをメインプログラムに通知します(WebView view, float oldScale, float newScale) のズーム時に呼び出されますViewView の変更(WebView ビュー、KeyEvent イベント) WebView がキー押下時間を処理するかどうかを制御します。 true を返した場合、WebView は false を返した場合は処理しません(WebView view, String url)新しくロードされた URL の処理を​​制御し、メイン プログラムが WebView を処理しないことを示す true を返し、WebView が処理することを示す false を返します(WebView view 、 int errorCode、 String description、 String failedUrl) を呼び出したときに回復不能なエラー メッセージが発生しました
MethodFunction
onPageStared(WebView view, String url) Web ページの読み込みが開始されたことをメイン プログラムに通知します
ページ終了しました(WebView View、String URL、BitMap Favicon)
onScaleChanged
shouldOverrideKeyEvent
。 shouldOverrideUrlLoading
onReceivedError

WebSettings: JS スクリプトの実行を許可するかどうかの setJavaScriptEnabled() 設定など、WebView 関連の構成設定 いくつかのメソッドは次のとおりです:

上記のloadDataより WebViewのWebViewClientオブジェクトを指定すると、WebViewClientはWebViewによるさまざまな通知、リクエスト、その他のイベントの処理を支援できます。 WebView の WebChromeClient オブジェクトを指定します。WebChromeClient は、WebView による JS ダイアログ ボックス、Web サイトのタイトル、Web サイトのアイコン、プログレス バーの読み込みなどを支援するために特別に使用されます。

ここで 3 つのロード メソッドの違いを区別することが重要です:

loadUrl(): Web ページのコンテンツを直接表示します (ネットワーク画像のみを表示します)。通常、文字化けは表示されません。 loadData(data, "text/html", "UTF-8"): URI 形式でデータをロードするために使用されます。コンテンツはネットワーク経由でロードできません。 画像が読み込めなかったり、文字化けが発生したりすることがよくありますが、String 型のデータは主に Unicode でエンコードされていることがわかっています。 WebView は通常、リソースを節約するために UTF-8 エンコードを使用しますが、WebView 用に設定する必要があります。 webview.getSettings().setDefaultTextEncodingName("UTF -8");loadDataWithBaseURL(baseUrl, string, "text/html", "utf-8", null):loadData クラスの 1 つ 拡張クラス。画像をロードできます。baseUrl は保存された画像パスです。文字化けしたコードを解決するには、ここで utf-8 を設定するだけです。 問題!

これは一部の属性のリストにすぎません。その他については、公式ドキュメントをご自身で確認する必要があります:

WebChromeClient Documentation

WebSettings Documentation

3.いくつかの一般的な要件

requirements1:url

1に従ってウェブページを読み込む1)アクティビティに直接ウェブビューを読み込みます

runrendernings:

implementationコード:

2) レイアウト コードで WebView を設定します1.gif

皆さんもよくニュース アプリやポータル情報アプリを見たことがあると思いますが、その構造は次のとおりです。


左上隅に、現在のアクティビティを閉じるボタンが中央にあり、右側に更新ボタンがあります。 右下隅にこのようなフローティングボタンがある場合がありますが、画面の幅を超えてスライドすると表示されます。 ユーザーがクリックすると、Web ページの上部にスクロールして戻ります。簡単に実装してみましょう!

レンダリングの実行

:

2.png

実装コード

:

MainActivity.java

:3.gif

public class MainActivity extends AppCompatActivity {

    private WebView webView;
    private long exitTime = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        webView = new WebView(this);
        webView.setWebViewClient(new WebViewClient() {
            //设置在webView点击打开的新网页在当前界面显示,而不跳转到新的浏览器中
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });
        webView.getSettings().setJavaScriptEnabled(true);  //设置WebView属性,运行执行js脚本
        webView.loadUrl("http://www.baidu.com/");          //调用loadView方法为WebView加入链接
        setContentView(webView);                           //调用Activity提供的setContentView将webView显示出来
    }


    //我们需要重写回退按钮的时间,当用户点击回退按钮:
    //1.webView.canGoBack()判断网页是否能后退,可以则goback()
    //2.如果不可以连续点击两次退出App,否则弹出提示Toast
    @Override
    public void onBackPressed() {
        if (webView.canGoBack()) {
            webView.goBack();
        } else {
            if ((System.currentTimeMillis() - exitTime) > 2000) {
                Toast.makeText(getApplicationContext(), "再按一次退出程序",
                        Toast.LENGTH_SHORT).show();
                exitTime = System.currentTimeMillis();
            } else {
                super.onBackPressed();
            }

        }
    }
}

質問と回答:

私たちが何にページに入った後、リターンキーを何度押しても終了しません。 現在の APP では、手動で戻るボタンをクリックし、finish メソッドを呼び出して現在のアクティビティを閉じる必要がありますか? どうしてこれなの?それは明らかに Baidu の最初のページですか?

回答: 実際、この理由は次のとおりです: URL のリダイレクトの問題です。実際、Baidu にアクセスしたとき:

www.baidu.com をロードしたにもかかわらず、Baidu はリダイレクトを実行し、Baidu のモバイル バージョンにジャンプしました。 Webサイト: つまり、実際のプロセスは次のとおりです。 www.baidu.com -> Baidu のモバイル版 -> 他のリンクを開きます。

上記の shouldOverrideUrlLoading() メソッドは次のように記述されていることがわかります:

view.loadUrl(url); return true; ユーザーが [戻る] ボタンを 1 回クリックすると、WebView が goback メソッドを呼び出すことがわかります。 ) 一旦、上位 3 つを載せます A、B、C の 3 つのサイトがあるとします。C で戻ると、B - > A をクリックすると問題が発生します。 B が A に来たのに、リダイレクトにより再び B に飛んでしまう…これが原因です。 「戻る」ボタンをクリックしても WebView が起動しない原因: 手の速度、Web ページが WebView に読み込まれない。 「戻る」ボタンを連続してダブルクリックすると、手の速度が十分に速くなるはずです (笑)。冗談ですが、この問題を解決するには、次のことだけを行う必要があります。 shouldOverrideUrlLoading 内の内容を削除し、 return false と書きます。 リダイレクトではないと思われる場合は、URL を自分で変更してみてください~


要件 2: WebView スクロール イベントの監視

残念ながら、スクロール イベントの監視には通常 setOnScrollChangedListener の設定が必要であることは誰もが知っています。 WebView はそのようなメソッドを提供しませんが、WebView を書き換えてそのメソッドの 1 つをオーバーライドできます。 protected void onScrollChanged(final int l,final int t,final int oldl,final int oldt){} 次に、外部へのインターフェイスを提供します。サンプル コードは次のとおりです。スクロールするには「へへ」ボタン、「へへ」ボタンをクリックしてトップに戻ります。 そうすれば、へへボタンが非表示になります~

要件 3: スクロール バーの問題

使用できる属性は次のとおりです:

sethorizo​​ntalScrollBarEnabled(false); //水平は表示されません

setVerticalScrollBarEnabled(false); //縦は表示されません Display

setScrollBarStyle(View.SCROLLBARS_OUTSIDE_OVERLAY);//WebViewの内側にスクロールバーが表示されます

4.gifsetScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY)//WebViewの外側にスクロールバーが表示されます


要件4: スケーリングとアダプティブ画面を設定します

Web ページを開くときの一般的な習慣によれば、WebView がはっきりと見えない場合は、2 本の指で Web ページをズームインまたはズームアウトすることが好きです。 スケーリングをサポートするかどうかを手動で設定する必要があります。

次のコードを追加するだけです:
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
    
        private Button btn_back;
        private TextView txt_title;
        private Button btn_top;
        private Button btn_refresh;
        private WebView wView;
        private long exitTime = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            bindViews();
        }
    
    
        private void bindViews() {
            btn_back = (Button) findViewById(R.id.btn_back);
            txt_title = (TextView) findViewById(R.id.txt_title);
            btn_top = (Button) findViewById(R.id.btn_top);
            btn_refresh = (Button) findViewById(R.id.btn_refresh);
            wView = (WebView) findViewById(R.id.wView);
    
            btn_back.setOnClickListener(this);
            btn_refresh.setOnClickListener(this);
            btn_top.setOnClickListener(this);
    
            wView.loadUrl("http://www.baidu.com");
            wView.setWebChromeClient(new WebChromeClient() {
                //这里设置获取到的网站title
                @Override
                public void onReceivedTitle(WebView view, String title) {
                    super.onReceivedTitle(view, title);
                    txt_title.setText(title);
                }
            });
    
    
            wView.setWebViewClient(new WebViewClient() {
                //在webview里打开新链接
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    return true;
                }
            });
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_back:
                    finish();          //关闭当前Activity
                    break;
                case R.id.btn_refresh:
                    wView.reload();    //刷新当前页面
                    break;
                case R.id.btn_top:
                    wView.setScrollY(0);   //滚动到顶部
                    break;
            }
        }
        
        @Override
        public void onBackPressed() {
            if (wView.canGoBack()) {
                wView.goBack();
            } else {
                if ((System.currentTimeMillis() - exitTime) > 2000) {
                    Toast.makeText(getApplicationContext(), "再按一次退出程序",
                            Toast.LENGTH_SHORT).show();
                    exitTime = System.currentTimeMillis();
                } else {
                    finish();
                }
    
            }
        }
    }
  • 上記のコードを使用すると、ページは次のようになります:
  • ズームすると、非常に一般的なズーム制御である嫌な問題が発生します。 次に、次のコードを追加してズーム コントロールを非表示にします。

    /**
     * Created by Jay on 2015/9/11 0011.
     */
    public class MyWebView extends WebView {
    
        private OnScrollChangedCallback mOnScrollChangedCallback;
    
        public MyWebView(Context context) {
            super(context);
        }
    
        public MyWebView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyWebView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt) {
            super.onScrollChanged(l, t, oldl, oldt);
            if (mOnScrollChangedCallback != null) {
                mOnScrollChangedCallback.onScroll(l - oldl, t - oldt);
            }
        }
    
        public OnScrollChangedCallback getOnScrollChangedCallback() {
            return mOnScrollChangedCallback;
        }
    
        public void setOnScrollChangedCallback(
                final OnScrollChangedCallback onScrollChangedCallback) {
            mOnScrollChangedCallback = onScrollChangedCallback;
        }
    
        public static interface OnScrollChangedCallback {
            //这里的dx和dy代表的是x轴和y轴上的偏移量,你也可以自己把l, t, oldl, oldt四个参数暴露出来
            public void onScroll(int dx, int dy);
        }
    
    }

    webView だけのために、初期のズーム率を自分で設定することもできます:

    public class MainActivity extends AppCompatActivity {
    
        private MyWebView wView;
        private Button btn_icon;
        private long exitTime = 0;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            btn_icon = (Button) findViewById(R.id.btn_icon);
            wView = (MyWebView) findViewById(R.id.wView);
            wView.loadUrl("http://www.hao123.com");
            wView.setWebViewClient(new WebViewClient() {
                //在webview里打开新链接
                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    view.loadUrl(url);
                    return true;
                }
            });
    
            //比如这里做一个简单的判断,当页面发生滚动,显示那个Button
            wView.setOnScrollChangedCallback(new MyWebView.OnScrollChangedCallback() {
                @Override
                public void onScroll(int dx, int dy) {
                    if (dy > 0) {
                        btn_icon.setVisibility(View.VISIBLE);
                    } else {
                        btn_icon.setVisibility(View.GONE);
                    }
                }
            });
    
            btn_icon.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    wView.setScrollY(0);
                    btn_icon.setVisibility(View.GONE);
                }
            });
    
        }
    
        @Override
        public void onBackPressed() {
            if (wView.canGoBack()) {
                wView.goBack();
            } else {
                if ((System.currentTimeMillis() - exitTime) > 2000) {
                    Toast.makeText(getApplicationContext(), "再按一次退出程序",
                            Toast.LENGTH_SHORT).show();
                    exitTime = System.currentTimeMillis();
                } else {
                    finish();
                }
    
            }
        }
    }

    ねえ、上記は Web ページ全体をズームしたものですが、場合によってはフォントを拡大縮小するだけで済みます。 これを実行します:

    WebSettings settings = wView.getSettings();
    settings.setUseWideViewPort(true);//设定支持viewport
    settings.setLoadWithOverviewMode(true);   //自适应屏幕
    settings.setBuiltInZoomControls(true);
    settings.setDisplayZoomControls(false);
    settings.setSupportZoom(true);//设定支持缩放

    settings.setDisplayZoomControls(false);

    を使用してサイズを直接設定することもできます。

    Android には、5 つのオプションのフォント サイズ値があります: SMALLEST (50%)、SMALLER (75%)、NORMAL (100%)、LARGER (150%)、LARGEST (200%)。


    要件 5. WebView の Cookie データを取得する

    Cookie が実際にはユーザーの一意の識別子を表す単なる文字列であることは誰もが知っています。一般的なシナリオは次のとおりです。 ユーザーがアカウントのパスワードを入力し、クリックしてログインした後、サーバーが提供する関連サービスにアクセスするには、この Cookie を使用する必要があります。 onPageFinsihed メソッドに Cookie の取得を書き込むことができます。

    wView.setInitialScale(25);//为25%,最小缩放等级

    要件 6. WebView の Cookie データを設定します。 WebView の Cookie の設定についてはどうすればよいでしょうか? Cookie を設定する必要がある場合は、次のコードを追加します:

    settings.setTextZoom(int);

    ちなみに、上記のコードは、loadUrl() よりも前に記述する必要があります。Cookie が設定されている場合は、他の設定は行わないようにします。 そうしないと無効になる可能性がありますので、webView 関連の設定の最後〜loadUrl() の前に設定することをお勧めします。

    WebViewDemo1:

    WebViewDemo1.zip をダウンロードします。 :
    WebViewDemo2 をダウンロードします

    このセクションの概要:

    このセクションでは、WebView の基本的な使用方法、Web ページの読み込み、スケーリング、フォント スケーリングの設定、 アダプティブスクリーンやCookieの取得や設定など、日々の開発では様々なニーズがあると思いますが、 スペースの都合上、ここまでしか書きませんが、アイデアを歓迎するメッセージがあれば、次のセクションで HTML5 側で JavaScript を使用する方法を学びます。 WebView を操作して、携帯電話の関連データを取得してください。乞うご期待~ありがとう~

methodfunction
getSettings()は、WebView
のプロパティ設定を制御するために使用されるWebSettingsオブジェクトを返します。 loadUrl (文字列url) 指定された URL をロードします
loadData(文字列データ、文字列 mimeType、文字列エンコード) タグ ヘッダーとして「data:」を使用して、このメソッドはネットワーク データをロードできません。ここで、mimeType は、textml、image/jpeg などのデータ型の場合、エンコーディングは文字のエンコード方式です
loadDataWithBaseURL(StringbaseUrl, String data, String mimeType, String encoding, String HistoryUrl)
setWebViewClient(WebViewClient client)
setWebChromeClient(WebChromeClient client)