ケルベロスさんのプログラミング / けるぷろ

プログラマのけるさんことケルベロスです

AndroidでWebブラウザアプリを作る

AndroidでWebブラウザアプリを作る

主に使用するクラス
android.webkit.WebView

WebView実装

...省略

private WebView mWebView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // webView
    mWebView = (WebView) findViewById(R.id.web_view);
    mWebView.setWebViewClient(new MyWebViewClient());  // ->(1)
    mWebView.loadUrl("https://www.yahoo.co.jp");       // ->(2)
    mWebView.getSettings().setJavaScriptEnabled(true); // ->(3)
}

...省略

(1) setWebViewClientはWebViewでのイベントをハンドリングするために実装してsetする
(2) URLを読み込む
(3) WebView内でJavaScriptを有効にする

WebViewClientでWebView内のイベントをハンドリングする

...省略

private class MyWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { // ->(4)
        return false;
    }

    @Override
    public void onPageStarted(WebView view, String url, Bitmap favicon) { // ->(5)
        super.onPageStarted(view, url, favicon);
    }

    @Override
    public void onPageFinished(WebView view, String url) { // ->(6)
        super.onPageFinished(view, url);
    }

    @Override
    public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { // ->(7)
        super.onReceivedError(view, request, error);
    }
}

...省略

(4) リクエスト開始前にハンドリングされる trueを返すと他アプリやActivityが起動するデフォルトの挙動になるのでfalseを返す
(5) 読み込み開始処理
(6) 読み込み終了
ブラウザであればこの時点でURLのstringを取得してURLバーに表示させることができる
(7) エラーハンドリング

端末の戻るボタンでブラウザバックを実装

...省略

@Override
public void onBackPressed() {
    if (mWebView.canGoBack()) { // ->(7)
        mWebView.goBack();      // ->(8)
    } else {
        super.onBackPressed();  // ->(9)
    }
}

...省略

(7) canGoBackがtrueならばブラウザバックをすることができる
(8) goBackでブラウザバック
(9) canGoBackがfalseならば端末の戻る機能をそのまま使用する

検索を実装する

android.support.v7.widget.SearchView
を利用して検索バーを実装する

...省略

private SearchView mSearchView;

...省略

@Override
protected void onCreate(Bundle savedInstanceState) {

...省略

    // search view
    mSearchView = (SearchView) findViewById(R.id.search_view); 
    mSearchView.setOnQueryTextListener(new MySearchViewTextListener()); // ->(10)

...省略

(10) イベントリスナをセットする

...省略

private class MySearchViewTextListener implements SearchView.OnQueryTextListener { // ->(11)
    @Override
    public boolean onQueryTextSubmit(String query) { // ->(12)
        searchTextInWebView(query);                  // ->(13)
        return false;                                // ->(14)
    }

    @Override
    public boolean onQueryTextChange(String newText) { // ->(15)
        return false;                                  // ->(16) 
    }
}

...省略

(11) SearchView.OnQueryTextListenerをimplementsしたクラスを定義する
(12) キーボードの送信を押したときのコールバック
(13) WebViewを使用して検索するためのメソッド(後述)
(14) falseを返すとハンドリングする trueを返すとデフォルトの挙動になる(Intentの発生など)
(15) テキストが変更されたときのコールバック
(16) falseを返すとハンドリングする trueを返すとデフォルトの挙動になる(Intentの発生など)

...省略

/** WebView内でYahoo検索をするメソッド */
private void searchTextInWebView(String text) {
    String p = "";                                                                  // ->(17)
    try {
        p = URLEncoder.encode(text,"UTF-8");                                        // ->(18)
    } catch (UnsupportedEncodingException e) { 
        e.printStackTrace();
    }

    String url = "https://kids.yahoo.co.jp/search/bin/search?ei=UTF-8&fr=ush&p="+p; // ->(19)
    mWebView.loadUrl(url);

    mSearchView.clearFocus();                                                       // ->(20)
    mWebView.requestFocus();
}

...省略

(17) 検索クエリの初期化
(18) java.net.URLEncoderを使用して検索クエリをエンコードする
(19) Yahoo検索のGETパラメータに検索クエリをセットする
(20) SearchViewのフォーカスを外してキーボードを隠す

まとめ

以上で簡単なブラウザアプリを実装することができます

サンプルコード

githubにありますので参考にしていただければと思います https://github.com/rdme/WebViewSample