LoginSignup
9
5

More than 3 years have passed since last update.

【Android】特定のリンクをアプリ内で開く(WebView)

Posted at

はじめに

アプリ内でWebページ(Qiita)を開き、
なおかつ、自分の記事をタップしたときはアプリ内でページ遷移、
それ以外(Homeボタン)をタップしたときはデフォルトブラウザを起動して開く実装をしてみた。

アプリ内(WebView)で開いたとき デフォルトブラウザ(Chrome)で開いたとき
webView.gif default.gif

WebViewについて

WebViewクラスは、Viewクラスの拡張。
WebViewを使うことで自分のアプリ内でウェブページまたは他アプリを開くことができる。

AndroidManifestの設定

インターネットアクセスをするため、android.permission.INTERNETを記述

AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.webviewapp">

    <!-- インターネット アクセスを取得 -->
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.WebViewapp">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
    </application>
</manifest>

Layoutの設定

レイアウトにWebViewを追加する

activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <!-- 下記を記述 -->
    <WebView
        android:id="@+id/webview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

Activityの作成①(初期ページのリンクをwebViewで表示させる)

MainActivity.java
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        WebView webView = findViewById(R.id.webview);

        // webViewでリンクを開く
        webView.loadUrl("https://qiita.com/kilalabu");

        // getSettings() で WebSettingsを取得し、javascriptを有効化
        webView.getSettings().setJavaScriptEnabled(true);
    }

    // ウェブページ履歴を操作する(戻るボタンで戻れるようにする)
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        WebView webView = findViewById(R.id.webview);
        // canGoBack()でアクセスできるウェブページ履歴がある場合に true を返す
        if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) {
            webView.goBack();  // 履歴を後に進める場合はgoForward()
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
}

Activityの作成②(特定のリンクのみアプリ内で開くようにする)

onCreate()内に下記を追記


webView.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (url.contains("kilalabu")) {
          return false;  // falseを返すことでWebView内でリンク先URLを開く
        }
        // trueを返すことで、WebView内で開かないようにさせる
        // 今回はデフォルトのウェブブラウザでリンク先を開く
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
        return true;
    }
});

shouldOverrideUrlLoading()について

  • webView内のリンクがタップされた際に呼び出されるメソッド
  • 返り値により 「webView内でリンクを開く(false)」 or 「別でリンクを開く(true)」 と分けることができる。

参考URL

9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5