【Android Kotlin】[WebView]ネイティブアプリの中にアプリ内ブラウザを埋め込む（外部ブラウザ起動で詳細ページ表示）

環境メモ
⭐️Mac Book Pro(macOS Catalina)
⭐️Android Studio 4.1(Kotlin)

実際に動かした動画↓↓↓

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">📱Android Kotlin📱<br>💡自分メモ🍬<br>ネイティブアプリの中にアプリ内ブラウザを埋め込む実装やってみたよぉ😊<a href="https://t.co/H7EyAY1NUL">https://t.co/H7EyAY1NUL</a><a href="https://twitter.com/hashtag/Android?src=hash&amp;ref_src=twsrc%5Etfw">#Android</a> <a href="https://twitter.com/hashtag/Kotlin?src=hash&amp;ref_src=twsrc%5Etfw">#Kotlin</a> <a href="https://t.co/vRBGzWxCom">pic.twitter.com/vRBGzWxCom</a></p>&mdash; non (@nonnonkapibara) <a href="https://twitter.com/nonnonkapibara/status/1363474474553782276?ref_src=twsrc%5Etfw">February 21, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 実装した内容
- 画面の中央エリアだけ、アプリ内ブラウザ（Pixabayの画像）を表示する実装をやってみた。

- アプリ内ブラウザ内のリンクをTapすると、外部ブラウザを起動して詳細ページを表示する。
![スクリーンショット 2021-02-21 21.50.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/257b33e6-538d-4867-b15c-06f28062aa05.png)


類似
アプリ内ブラウザ内のリンクをTapすると、アプリ内ブラウザで詳細ページを表示する。
については、こちらを参照
**【Android Kotlin】[WebView]ネイティブアプリの中にアプリ内ブラウザを埋め込む（内部ブラウザ起動で詳細ページ表示）**
https://qiita.com/nonkapibara/items/ec0e2b1f571fcc00dc2a


# 構成の説明
1.ヘッダー部分を固定で表示する
2.アプリの中にブラウザの内容を表示する。
この中だけスクロールする
3.アプリ内ブラウザを読み込み中はローディングを表示する
4.アプリ内ブラウザ内のリンクをTapすると、外部ブラウザで詳細ページを起動する
5.フッターを固定表示する
6.フッターエリアに次画面へ表示するボタンを配置する。
ボタン押下時、Page2の次の画面を表示する

![スクリーンショット 2021-02-21 19.52.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/bb8b473d-0746-d5fa-3ff6-67927577ab84.png)

![スクリーンショット 2021-02-21 19.51.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/9fec1fa2-2b24-871b-1e24-e47bbdf12e5f.png)

![スクリーンショット 2021-02-21 20.27.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93155/ed68cb2b-b383-c1a2-60af-794133cf5d8c.png)


`MainActivity.kt`　←メインの画面
`activity_main.xml`　←メインのレイアウト画面

`Page2Activity.kt`　←PAGE2画面
`page2.xml`　←PAGE2のレイアウト画面


# ポイント
・アプリ内ブラウザを表示するには`WebView`を使用する
・WebViewの中だけスクロールするように`WebView`の外側に`ScrollView`を配置する
・アプリ内ブラウザを読み込み中のローディング表示は、`ProgressBar`を使用する
・プログレスバーのスタイルは`Widget.DeviceDefault.Light.ProgressBar.Large`を使用する
・インターネット接続をするので、マニフェスト`AndroidManifest.xml`に、インターネットパーミッションを実装する

```
<uses-permission android:name="android.permission.INTERNET"/>
```


# 全ソース

MainActivity.kt　←メインの画面

```kotlin:MainActivity.kt
package com.example.webviewsample

import android.content.Intent
import android.graphics.Bitmap
import android.net.Uri
import android.os.Bundle
import android.view.View
import android.webkit.WebResourceRequest
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.Button
import android.widget.ProgressBar
import android.widget.ScrollView
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity(), View.OnClickListener {

    private lateinit var nextButton: Button
    private lateinit var testWebView: WebView
    private lateinit var testProgress: ProgressBar
    private lateinit var testScroll: ScrollView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 「Page2」のボタン
        nextButton = findViewById(R.id.next_button)
        // 「Page2」リスナー
        nextButton.setOnClickListener(this)
        // スクロール
        testScroll = findViewById<View>(R.id.testScroll) as ScrollView
        // WebView
        testWebView = findViewById<View>(R.id.testWebView) as WebView
        // プログレスバー
        testProgress = findViewById<View>(R.id.test_progress) as ProgressBar
        // webViewのローディングイベント設定
        settingWebViewClient()

        // Java Scriptを有効にする
        testWebView.getSettings().setJavaScriptEnabled(true);
        // WebView内に表示するURL 検索キーワード「クラゲ」
        testWebView.loadUrl("https://pixabay.com/ja/photos/search/%E3%82%AF%E3%83%A9%E3%82%B2/")

        // webViewにフォーカスセットする
        testWebView.requestFocus();
    }

    /**
     * settingWebViewClient
     * webViewのローディングイベント設定
     */
    fun settingWebViewClient() {

        testWebView.webViewClient = object: WebViewClient() {
            /**
             * onPageStarted
             * ローディング開始時に呼ばれる
             */
            override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                super.onPageStarted(view, url, favicon)
                // プログレスバー表示
                testProgress.setVisibility(View.VISIBLE);
                // webView非表示
                testWebView.setVisibility(View.GONE);
            }

            /**
             * onPageFinished
             * ローディング終了時に呼ばれる
             * @param view
             * @param url
             */
            override fun onPageFinished(view: WebView?, url: String?) {
                super.onPageFinished(view, url)
                // プログレスバー非表示
                testProgress.setVisibility(View.GONE);
                // webView表示
                testWebView.setVisibility(View.VISIBLE);
            }

            /**
             * shouldOverrideUrlLoading
             * WebViewにロードされようとしているときに呼ばれる
             * @param view
             * @param request
             * @return trueは外部ブラウザ起動 or falseはWebView内に表示する
             */
            override fun shouldOverrideUrlLoading(view: WebView?,request: WebResourceRequest): Boolean {
                // 外部ブラウザ起動する場合はtrueを返す

                if (request.url != null) {
                    // 外部ブラウザ起動
                    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(request.url.toString()))
                    startActivity(intent)
                }
                return true
            }
        }
    }

    /**
     * onClick
     * @param view
     */
    override fun onClick(view: View) {
        when (view.getId()) {
            R.id.next_button -> {
                val intent = Intent(this, Page2Activity::class.java)
                startActivity(intent)
            }
            else -> {
                println("else")
            }
        }
    }
}

```

activity_main.xml　←メインのレイアウト画面

```xml:activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_main"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/hotpink"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_margin="16dp"
            android:text="★★★★HEADER★★★★"
            android:textColor="@color/darkred"
            android:textSize="20sp"
            android:textStyle="bold"/>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_weight="1"
        android:orientation="vertical">

        <ProgressBar
            android:id="@+id/test_progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            style="@android:style/Widget.DeviceDefault.Light.ProgressBar.Large"
            android:layout_gravity="center_horizontal"
            android:visibility="visible" />

        <ScrollView
            android:id="@+id/testScroll"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <WebView
                android:id="@+id/testWebView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </ScrollView>
    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/pink"
        android:orientation="vertical">

        <Button
            android:id="@+id/next_button"
            android:layout_width="200dp"
            android:layout_height="match_parent"
            android:layout_gravity="center_horizontal"
            android:layout_margin="5dp"
            android:backgroundTint="@color/mediumvioletred"
            android:text="Page2へ"></Button>
    </LinearLayout>
</LinearLayout>

```

Page2Activity.kt　←PAGE2画面

```kotlin:Page2Activity.kt
package com.example.webviewsample

import android.os.Bundle
import android.view.View
import android.webkit.WebView
import androidx.appcompat.app.AppCompatActivity

class Page2Activity: AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.page2)
    }
}

```

page2.xml　←PAGE2のレイアウト画面

```xml:page2.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/layout_main"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@color/darkorange">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="@color/saddlebrown">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="16dp"
            android:layout_gravity="center_horizontal"
            android:textColor="@color/white"
            android:text="Page2" />
    </LinearLayout>

</LinearLayout>
```


```xml:AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.webviewsample">
    <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.WebViewSample">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".Page2Activity"/>
    </application>

</manifest>
```