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は既に開いているので紫に。
再びtab2に。
切り替わる。
Button1を押した場合でも、同じように新規タブが開いてロードされる。
Sample/android/WebView.WebViewTransport/WV.WVT at master · bg1bgst333/Sample · GitHub