はじめに
アプリ内でWebページ(Qiita)を開き、
なおかつ、自分の記事をタップしたときはアプリ内でページ遷移、
それ以外(Homeボタン)をタップしたときはデフォルトブラウザを起動して開く実装をしてみた。
アプリ内(WebView)で開いたとき | デフォルトブラウザ(Chrome)で開いたとき |
---|---|
![]() |
![]() |
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