WebView.WebViewTransport

WebView上で、HTMLでtarget="_blank"という場合であったり、JavaScriptでwindow.openという場合など、新規にウィンドウやタブを開きつつ、ロードしないといけない場合がある。
両方に対応するには、WebView.WebViewTransportを使う必要がある。

WebView.WebViewTransport  |  Android Developers

assetsフォルダの下にhtmlを置いて、

target="_blank"なLINKと、onClick="openWindow()"なButton1を配置。
activity_main.xmlは、

FrameLayoutのみ。
activity_sub.xmlは、

LinearLayoutの中に、WebViewだけ。
MainActivityは、

最初に、"id"が"tab1"、"url"が"file:///android_asset/test.html"、であるSubActivityのIntentを追加。
frame_mainを取得し、mWindow1のdecorView1を追加。

タブ切り替え処理。
SubActivityは、

渡されたURLをWebViewでロード。
この時、CustomWebViewClient、CustomWebChromeClientを生成してセット。
CustomWebViewClientは、

これまでと変わらない。
CustomWebChromeClientは、

onCreateWindowがポイント。
ここで空のタブを開いて、decorView2を取得し、そこからWebViewを取得、WebView情報をresultMsgで送信。(ここでWebViewTransportを使う。)
mainContentViewを全削除し、frame_mainにdecorView2をセット。

こうなってる
こうなってる

こうなってる。
LINKクリックすると、

このように開く
このように開く

このように開く。
開いたタブがtab2なので、

tab1に戻る
tab1に戻る

tab1に戻る。

tab1は既に開いているので紫に
tab1は既に開いているので紫に

tab1は既に開いているので紫に。

再びtab2に
再びtab2に

再びtab2に。

切り替わる
切り替わる

切り替わる。
Button1を押した場合でも、同じように新規タブが開いてロードされる。

Sample/android/WebView.WebViewTransport/WV.WVT at master · bg1bgst333/Sample · GitHub